C++拷贝构造函数剖析(copy constructor)

首先让我们看一下,下面的代码,然后再做剖析:

  1 #include <iostream>                                                                                                                                                         
  2 #include <string>
  3 using namespace std;
  4 class person{
  5 public:
  6     person()
  7     {
  8         cout << "this is default constructor!" << endl;
  9     }
 10     person(string temp)
 11     {
 12         name = temp;
 13         cout << "this is parameter constructor!" << endl;
 14     }
 15     person(const person& temp)
 16     {
 17         this->name = temp.name;
 18         cout << "this is copy constructor!" << endl;
 19     }
 20     person& operator = (person& temp)
 21     {
 22         this->name = temp.name;
 23         cout << "this is = function " << endl;
 24         return *this;
 25     }
 26 
 27     string name;
 28 };
 29 int main()
 30 
 31     person a;
 32     person b;
 33     a = b;
 34     person c = a;
 35     person d("who");
 36 
 37     return 0;
 38 
 39 }

运行输出的结果:

  

 

因此我们可以看出:

当我们使用已经初始化过后的对象a,b,让 a = b,实质上调用的是运算符重载。

当我们使用 person c = a;的时候,实质上调用的是copy construcotr(拷贝构造函数),也就是说这句话相当于 person c(a);

person c(a) 相当于 person c.person(a);即调用copy constructor

当a的值传递给copy constructor (person(const person& temp))的时候,如果没有加引用,即(person(person temp)),

那就相当于 再次构造,即perosn temp = a,所以我们需要再次的调用copy constructor,所以就陷入了无限的递归之中。

 用图表示为(将就着看一下吧):

   

而至于const的原因:

  其一:在函数体内能够不改变传递进来的数值。

  其二:如果我们传递的是person a("zhangfei"),同时没有 person(string temp) 的存在,这时通过copy constructor也是可以赋值的。

 

posted @ 2020-05-15 09:24  缄默先生  阅读(394)  评论(0编辑  收藏  举报