C++ 拷贝构造函数和重载赋值操作符不能相互调用

C++ 拷贝构造函数和重载赋值操作符不能相互调用

转载  2014年02月14日 09:35:05
  • 795

拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的。

首先:

拷贝构造函数的存在意义--------是通过已有的对象构造新的对象,构造完毕后才有两个对象

重载赋值操作符的意义-----------将一个对象的值赋给另一个对象,两个对象都已经构造完毕了

拷贝构造函数----调用-----重载赋值操作符:把已有对象的值赋给一个构造中的对象,虽然这个对象的内存已经分配好了

                                                                 但是有可能导致循环调用重载赋值操作符和拷贝构造函数

重载赋值操作符---调用------拷贝构造函数:把已有对象复制并赋值给这个对象。

                                                                  导致循环调用重载赋值操作符。

总之--复制构造函数调用赋值操作符就好像正在构造的对象却用已经构造好的对象;
           赋值操作符调用复制构造函数就好像用正在构造的对象进行赋值;

例子:

例子1:拷贝构造函数调用重载赋值操作符(导致循环调用重载赋值操作符和拷贝构造函数 )

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class Base {  
  5. public:  
  6.     Base() {cout << "Constructor invoked!" << endl;}  
  7.     ~Base() {cout << "Destructor invoked!" << endl;}  
  8.     Base(const Base& rhs) {  
  9.         cout << "Copy constructor invoked!" << endl;  
  10.         operator=(rhs); // *this = rhs;  
  11.     }  
  12.     Base operator=(const Base& rhs) { // 问题出在这里,返回值不是引用会调用拷贝构造函数  
  13.         cout << "Copy assignment operator invoked!" << endl;  
  14.         return *this;  
  15.     }  
  16. };  
  17.   
  18. int main(int argc, char** argv) {  
  19.     cout << "Hello World C++!" << endl;  
  20.     Base a;  
  21.     Base b(a); // Base b = Base(a);  
  22.     return 0;  
  23. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值