拷贝构造和拷贝赋值

拷贝构造表示有新的对象被定义:

Object obj1 = obj2; //新的Object对象obj1被定义,此时调用拷贝构造函数(copy construction)

拷贝赋值表示没有新的对象被定义:

obj1 = obj2; //obj1是一个已经被声明过的对象,此时调用的是拷贝赋值(copy assignment)

拷贝构造函数指明了类对象通过传值传参数的策略,即当一个类对象作为形参的时候:

bool testFunction(Object o);
Object obj;
if(testFunction(obj)); //此时,形参是通过传值传递给被调用函数的,所以obj通过拷贝构造函数复制到形参o中,但是一般情况下更好的方式是当类对象作为形参的时候,通过传引用进行参数传递。

当用户声明一个空的类,编译器会为它生成默认构造函数、析构函数、拷贝构造函数和拷贝赋值操作符,此时的默认拷贝构造和拷贝操作符只是简单的将目表类对象的non-static成员变量进行拷贝。
当拷贝构造函数进行成员变量拷贝,成员变量是用户自定义类型时,会调用其拷贝构造进行复制,当成员变量是内置类型时,会复制变量的每一个bit来进行复制。

当类成员是引用或者为const型变量的时候,编译器拒绝生成默认的拷贝赋值操作符,因为改变引用和const变量都是违法的!
但是要特别注意:如果用户创建了非默认的构造函数,编译器就不会再为类创建默认构造函数(类此时没有无参数的默认构造函数可用),但是拷贝构造函数和拷贝赋值操作符还是会被创建。

如果不想让类被拷贝,那么有一个办法就是阻止编译器生成默认的拷贝构造函数和拷贝赋值操作符:自行定义它们且声明为private型的,且不去实现它们,这样就可以阻止外界访问这两个方法,但是类自身的成员还是可以访问,并且会在链接阶段产生错误。
为解决这个问题,更进一步的,创建一个父类,在父类中实现private的拷贝构造函数和拷贝赋值操作符(当然也不实现),然后让子类继承,这样子类的成员也无法调用到这两个方法了!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值