关于拷贝构造函数,赋值运算符

关于拷贝构造函数和赋值运算符
作者:wuhran
2006-12-16

拷贝构造函数
 当我们通过复制一个对象来初始化一个对象的时候,拷贝构造函数都被执行。
 对于类中普通的成员变量,如,int, double, char, c++提供默认的拷贝构造函数,我们可以不用写拷贝构造函数就可以了。
 如果类中成员有如,CArray,*指针(深拷贝,浅拷贝问题),那么我们就需要写自己的拷贝构造函数。同时注意深拷贝,浅拷贝。
 如例子:
 class Sample
 {
  public:
   Sample();
   ~Sample();
  public:
   int nId;
   double dHeight;
   
 };
 
 typedef CArray<Sample, Sample> SampleArray;
 
 在函数中调用如:
 void TestSample()
 {
  Sample sample;
  sample.nId = 0;
  sample.dHeight = 0.0;
  
  SampleArray sampleArr;
  sampleArr.Add(sample);
  
 }
 
 OK,这样是正确的。对于基本的数据类型,C++提供了默认的拷贝构造函数。
 如果是这样,我们把Sample类修改一下;
 class Sample
 {
 public:
   Sample();
   ~Sample();
  public:
  CStringArray strArr;
  int nId;
 };
 
 typedef CArray<Sample, Sample> SampleArray;
 同样的方法用TestSample函数调用,编译就会出错,提示没有拷贝构造函数。因为CStringArray没有被提供默认的拷贝构造函数。
 下面是正确的写法:
 class Sample
 {
 public:
   Sample();
   ~Sample();
   
   Sample(const Sample& src)
   {
    strArr.Copy(src.strArr);
    nId = src.nId;
   }
   
  public:
   CStringArray strArr;
   int nId;
 };
 
 ok,编译通过,使用正常。
 
 还有一个就是深拷贝,浅拷贝的问题,很多文章讨论过,不多说了。
 
赋值操作符
 别的不多说,说说写法。
 class Sample
 {
  public:
   Sample();
   ~Sample();
   
   Sample(const Sample& src)
   {
    strArr.Copy(src.strArr);
    nId = src.nId;
   }
   
   Sample& operate = (const Sample& src)
   {
    if(this == &src)
    {
     return *this;
    }
    
    strArr.Copy(src.strArr);
    nId = src.nId;
    
    return *this;
   }
   
  public:
   CStringArray strArr;
   int nId;
 };
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值