C++之拷贝构造函数(浅拷贝与深拷贝)

        同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数。

关于复数类的简单构造函数、析构函数、缺省构造函数和构造函数实现

class Complex
{
   double Real; //实部
   double Image; //虚部
public:
   Complex():Real{},Image{}                //缺省的构造函数
  {
       cout<<"Create Object: "<<this<<endl;
  }
   Complex(double r,double i):Real{r},Image{i} // 带参数的构造函数
  {
       cout<<"Create Object: "<<this<<endl;
  }
   //Complex(Complex com); //
   //Complex(Complex &com);
   Complex(const Complex &com):Real{com.Real},Image{com.Image}
  {
       cout<<"Copy Create Object"<<this;
  }
   ~Complex()
  {
       cout<<"Destroy Object: "<<this<<endl;
  }
   void Print()  const // 常方法
  {
       cout<<"Real = "<<Real<<' t'<<" Image = "<<Image<<endl;
  }
};


        拷贝构造函数的参数——采用引用。如果把一个真实的类对象作为参数传递到拷贝构造函数,会引起无穷递归 。
        在类中如果没有显式给出拷贝构造函数时,则C++编译器自动给出一个缺省的拷贝构造函数。如果有程序设计者定义的构造函数(包括拷贝构造函数),则按函数重载的规律,调用合适的构造函数。
        缺省的拷贝构造函数的特点:按位拷贝。

注意:

        当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存新建立一个局部对象,并把实参拷贝到新的对象空间中。(进行深拷贝)

当函数的形参是类的对象
        当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。

当函数的返回值是类对象
        当函数的返回值是类对象,函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再
返回调用者。
        因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。
        所谓return 对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象空间。如果返回的是变量,处理过程类似,只是不调用构造函数。

小结:

1.拷贝构造函数是构造函数的一个重载形式。
2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
3.若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,称为:位拷贝。

因为拷贝构造的特点,在这里引出来了两种的拷贝形式:深拷贝和浅拷贝

浅拷贝是不独立创建空间的,仅仅只是将需要浅拷贝所需求拷贝的内容所在空间地址给拷贝者
深拷贝是重新建立空间,将待拷贝内容重新复制一份传递到新开辟的空间中去

简单理解:

这样就可以清楚看出,如果我们在调用函数进行拷贝时,选择的是浅拷贝,有可能在析构时出现对同一个空间进行二次甚至多次析构,所以我们在进行拷贝是要注意尽量实现深拷贝

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值