构造函数语义学----copy constructor

有三种情况会调用类的copy constructor。

1)明确地以一个对象的值给同类的另一对象赋值。

2)当类对象被当作参数传递给函数时。

3)当函数返回一个类对象时。

c++中编译器copy constructor的原则是memberwise initializatior,即把每一个内建的data member和派生的data member的值逐步拷贝到目标对象中,不过他不会拷贝其中的类对象,而是递归地拷贝内对象中的data member。当class object缺乏explicit copy constructor时,编译器会为其隐式定义或合成。编译器隐式定义的copy constructor有两种生成方式:

bitwise copy semantics(浅拷贝)和深拷贝。

浅拷贝:意味着类的数据成员只是一层深度的拷贝而已。如果类中成员变量的类型是基本的数据类型比如int,float,double等,那么浅拷贝与深拷贝的结果是一样的。然而如果类的成员变量中存在指针类型的变量时,后果很严重。

例如下面的例子:
class A
{
   int m1;
   double d1;
   char* pString;
};
如果你创建两个这样的类对象,class A  a, b;并且你给a赋值,
a.mi = 6;
a.d1 = 10.123;
a.pString = new char[10];
astrcpy(a.pString, "test");//这里是浅拷贝
如果执行b = a;那么会把对象a的每一个成员的值赋值给b的每个成员。
b.m1 = a.m1;
b.d1 = a.d1;
b.pString = a.pString;//现在对象a和b的成员pString都执向相同的内存,删除任一个内存都会析放另一个对象的内存。
所以你需要深拷贝,它不是拷贝的内存地址而是拷贝内存地址的内容。一个默认的拷贝构造函数经常执行浅拷贝,只有拥有
自己的拷贝函数才可以实现深拷贝。

深拷贝:它拷贝的不是指针地一般说来是深拷贝才是我们希望的拷贝类型,址,而是指针所指的内容。

在copy constructor中,编译器会合成上面哪种拷贝构造器完全取决于类对象本身。

以下四种情况编译器会合成深拷贝构造:

1)当class中含有member oject,而该member object有自己的拷贝构造函数(不管是自定义还是合成的)。

2)当class的base class有自己的拷贝构造函数(不管是自定义还是合成的)。

3)当class中声明一个或多个virtual functioon。

4)当class派生自继承串联,而其中有一个或多个virtual base class。

前两种情况中,编译器必须将内部类或基类的copy constructor调用操作安插到合成的copy constructor中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值