指针与复制构造函数

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


 

然后写复制构造函数:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值