C++学习笔记(三十一)拷贝构造函数与赋值运算符重载的区别

拷贝构造函数发生在对象还没有创建;赋值操作符重载仅发生在对象已经创建的情况下。一个对象的诞生首先必须经历构造过程,这也是构造函数存在的意义,而=运算符本身并不具有代替构造函数的作用,在题目中由于obj1obj2obj3都是首次出现的对象,因此必须经历构造函数,因此,即使obj3使用了=运算符,但是仍然必须要执行构造函数,此时的=也会被理解成调用了拷贝构造函数。
通常拷贝构造函数应用的场合有以下几个方面:
1、函数的参数是一个对象,并且是值传递方式。
2、函数的返回值是一个对象,并且是值传递方式。

3、用一个对象初始化另外一个对象。


在下边这个例子中我们能看到并不是出现“=”就是调用赋值构造函数:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Test  
  5. {  
  6.     public:  
  7.         Test()  
  8.         {     
  9.             ctor_count++;  
  10.             cout<<"ctor "<<ctor_count<<endl;  
  11.         }     
  12.   
  13.         Test(const Test & r)  
  14.         {     
  15.             ctor_count++;  
  16.             cout<<"copy ctor "<<ctor_count<<endl;  
  17.         }     
  18.   
  19.         Test & operator= (const Test& r)  
  20.         {     
  21.             ctor_count++;  
  22.             cout<<"assignment op "<<ctor_count<<endl;  
  23.             return *this;  
  24.         }     
  25.   
  26.     private:  
  27.         static int ctor_count; //only a declaration  
  28. };  
  29.   
  30. int Test::ctor_count=0; // definition + initialization  
  31. int Test::ctor_count=0; // definition + initialization  
  32. int main()  
  33.   
  34. {  
  35.     Test test;  
  36.     Test test1=test;  
  37.     Test test2(test);  
  38.     Test test3=test2=test1;  
  39.     return 0;  
  40. }  

输出结果

[root@xxx]$ ./a.out
ctor 1
copy ctor 2
copy ctor 3
assignment op 4
copy ctor 5


我们看到:

Test test; //实例化test对象时调用了默认构造函数

Test test1=test;// test1使用了复制构造函数(因为这是一个新的对象产生)

Test test2(test);//test2时也是用了复制构造函数,

Test test3=test2=test1;//而test2=test1则使用了赋值构造函数(没有新的对象产生),

Test test3=test2=test1;//test3=test2则使用了复制构造函数,原因同上。

 

所以要看是不是有新的对象产生,才能决定到底是调用了复制构造函数,还是赋值运算符。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值