拷贝构造函数和赋值函数

-- C++中拷贝构造函数被调用的三种情形

1) 一个对象以值传递的方式传入函数体;

2) 一个对象以值传递的方式从函数返回;

3) 一个对象需要通过另外一个对象进行初始化;

对于前两种情况,如果不使用拷贝构造函数,就会导致一个指针指向已经被删除的内存空间。

对于第三种情况,初始化和赋值操作的不同含义是构造函数调用的原因。事实上,拷贝构造函数是由普通的构造函数和赋值操作符共同实现的。

 

拷贝构造函数不可以改变它所引用的对象,原因如下:

当一个对象以值传递的方式传一个函数的时候,拷贝构造函数自动地被调用来生成函数中的对象。如果一个对象时被传入自己的拷贝构造函数。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

 

-- 隐式的拷贝构造函数

如果在类中没有显示的声明一个拷贝构造函数,那么编译器会自动生成一个来进行对象之间的位拷贝。这个隐含的拷贝构造函数简单的关联了所有的类成员。这个隐式地拷贝构造函数和显示声明的拷贝构造函数的不同在于对成员的关联方式。显示声明的拷贝构造函数关联的只是被实例化的类成员的缺省构造函数,除非另外一个构造函数在类的初始化或构造列表的时候被调用。

拷贝构造函数使程序更有效率,因为它不在构造一个对象的时候改变构造函数的参数列表。设计拷贝构造函数是一个良好的风格,即使是编译系统会自动为你生成默认的拷贝构造函数。事实上,默认的拷贝构造函数就可以应付许多情况。

 

-- 拷贝构造函数和赋值函数的区别:

拷贝构造函数是在对象创建的时候被调用的,而赋值函数只能被已经存在了的对象调用。简而言之,拷贝构造函数的左对象不存在,从无到有;赋值时左对象已经存在,从有到有。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值