个人积累 拷贝构造函数


  • 拷贝构造函数:第一个参数是自身类的引用,且任何额外参数都有默认值
类成员的类型决定了拷贝的方式,类类型的成员,调用拷贝构造函数,内置类型成员直接拷贝。
拷贝初始化通常使用拷贝构造函数或移动构造函数来完成。
发生拷贝初始化的情况:
  1. 使用“=”定义变量
  2. 将一个对象作为实参传递给一个非引用类型的形参
  3. 一个返回类型为非引用类型的函数返回一个对象
  4. 用花括号列表初始化一个数组中的元素或一个聚合类中的成员
注意:拷贝构造函数的参数必须是引用类型的,因为拷贝构造函数被用来初始化非引用类型的参数,如果不是引用类型为了调用拷贝构造函数就必须拷贝它的实参,而为了拷贝实参,又需要调用拷贝构造函数,造成循环。
默认拷贝构造函数仅仅拷贝对象本体(浅拷贝)(对对象中的数据成员进行简单的赋值
class p1("ok");
class p2(p1);
在这两句语句中,先创建p1对象,调用构造函数,再创建p2并不会调用class的构造函数,调用默认的拷贝函数进行简单的赋值,用于存储“ok”的指针指向的地址赋值给了p2的指针,导致p2中指针和p1指针指向同一个地址。而在析构时,先析构p2将存有ok的空间释放了,p1析构时就会出现无法预知的现象。
深拷贝:做动态内存分配,对于动态成员,应该重新动态分配空间。系统不会自动为对象做内存释放,一般来说,需要定义拷贝构造函数的类也需要定义析构函数,在对象生命期结束瞬间,系统自动调用析构函数(不通过显式语句)
  • 拷贝赋值运算符:返回左值的引用而非只是值   class& operator=(const class& )
和拷贝函数类似,不同在于赋值函数最好有返回(对象的引用)这样可进行链式赋值(x=y=z),在赋值前需要将自身的对空间释放掉
class New
{
  public:
  New(){}
~New(){delete s;}
  New& operator=(New& a)
  {
     if(s != NULL) delete s;
     p=a.p;
     int len=strlen(a.s);
     s=new char[len+1];
     return *this;
  }
int p;
char* s;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值