C++深拷贝与浅拷贝

  1. 构造函数

    在C++面向对象程序设计中,通过构造函数对对象进程初始化,它可以为对象在计算机内存中开辟内存空间,也可以为对象的数据成员提供初始值。构造函数时一个与类同名,没有返回值的特殊成员函数,每当创建一个对象时(包括使用new动态创建对象),编译系统就会自动调用构造函数。构造函数像类以外的一般函数和类成员函数一样,可以重载和带缺省参数,构造函数的重载为对象的生成提供了各种灵活的手段。

    构造函数分为缺省构造函数(默认构造函数)和用户自定义构造函数。当程序员没有定义构造函数时,系统就会提供一个无参的缺省构造函数,如果用户自定义了一个构造函数,编译器提供的缺省构造函数就自动消失了。

2.拷贝构造函数(复制构造函数)

    拷贝构造函数的功能是一个已有的对象来初始化一个被创建的同类的对象,是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类对象的引用。用户可以根据自己实际问题的需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果用户没有声明类的拷贝构造函数,系统就会自动生成一个缺省拷贝构造函数,这个缺省拷贝构造函数的功能是把初始的每个数据成员的值都复制到新建立的对象中。拷贝构造函数的声明如下:

        类名(类型 & 对象名);

1
2
3
4
5
6
7
8
9
10
11
class  people
{
  public :
      void  dipalay()
      {
      
      }
  private :
      int  a;
      char  *name;
};

    调用拷贝构造函数有以下三种情况:

    (1)用类的一个对象去初始化另一个对象时。

    (2)对象作为函数参数传递时,调用拷贝构造函数

    (3)如果函数的返回值是类的对象,函数调用返回时,调用拷贝构造函数。

3、深拷贝与浅拷贝

    由于C++提供的默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

    一般情况下,只需要使用系统提供的浅拷贝构造函数即可,但是,如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式。因为两个对象都拥有同一个资源,对象析构时,该资源将进行两次资源返还,此时必须自定义深拷贝构造函数,为创建的对象分配堆空间,否则会出现动态分配的指针变量悬空的情况。深拷贝需要同时复制对象空间和资源。

    简而言之,深拷贝就是如果一个类拥有资源,在它的对象之间进行发生复制的过程时,采用资源重新分配这个过程就是深拷贝。否则就是浅拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值