指针与复制构造函数

struct Node{
  char *name;
  int age;
  Node(char *n="", int a=0){
    name = new char[strlen(n)+1];
    strcpy(name, n);
    age = a;
  }	
}

 下面声明:

Node node1("Roger", 20), node2(node1); //or node2 = node1;
注意这是对象的复制,按照道理来说,是两个相互独立的对象,赋值是互不影响的
但是实际上不是这样的,看下面赋值:
strcpy(node2.name, "Wendy");
node2.age = 30;

输出node1.name, node1.age, node2.name, node2.age
Wendy 30 Wendy 20
可以看出对象名称是一样的,年龄不一样,why?
在于Node的定义没有提供复制构造函数,编译使用自己生成的构造函数。
然后默认就是逐个成员进行复制。因为name是一个指针,所以复制构造函数
将node1.name的地址复制给了node2.name,而不是将值拷贝过去。
为了阻止,必须是在拷贝name的时候,重新分配空间并将值拷贝过去,而不是地址。

具体的过程如图:复制构造函数.bmp

指针与复制构造函数_第1张图片
 

然后写复制构造函数:
struct Node{
  char *name;
  int age;
  Node(char *n="", int a=0){
    name = new char[strlen(n)+1];
    strcpy(name, n);
    age = a;
  }	

  Node(const Node& n){
   name = new char[strlen(n.name)+1];
   strcpy(name, n.name); 
   age = n.age;
 }
}
 如果使用node2 = node1;同样会有这样的问题,那怎么办,重载操作符
Node& operator=(const Node& n){
  if(this != &n){
    if(name!= 0) delete[] name;
   name = new char[strlen(n.name)+1];
   strcpy(name, n.name); 
   age = n.age;
  }
  return *this;
}
 最后在来个析构函数:
~Node(){
  if(name!=0) delete[] name;
}

你可能感兴趣的:(算法,指针,复制构造函数)