首先让我们看一下,下面的代码,然后再做剖析:
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也是可以赋值的。