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
![](http://dl.iteye.com/upload/attachment/0069/0515/ab6aa31e-5ba5-3ee3-b856-37157a548f8d.bmp)
然后写复制构造函数:
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;
}