C++---拷贝构造函数和赋值构造函数
摘要:最近看了一道面试题问:C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用(《面向对象程序设计--C++语言描述(第二版)》这本书中有叙述),但是拷贝赋值函数的形参通常也是自身类型的引用,那么我们到底能不能将它们的形参改为值传递呢?
1,拷贝构造函数(不能进行值传递)
拷贝构造函数的原型有两种:
1 // 拷贝构造函数原型 2 Person( Person& ); // method 1 3 Person( const Person& ); // method 2 4 5 // 下面这种原型是错的 6 Person( Person ); // 不能进行值传递,只能传递引用
不能进行值传递的原因:如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环。
2,拷贝赋值函数(能进行值传递)
拷贝赋值函数的原型:
1 // 拷贝赋值函数原型 2 Person& operator=( const Person& );
为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)
为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:
1 #include <iostream> 2 using namespace std; 3 4 class A { 5 public: 6 A():a(0){} 7 A(int k) {a = k;} 8 A& operator=(A other){ // 进行值传递而非引用传递 9 this->a = other.a; 10 } 11 int get(){return a;} 12 ~A(){} 13 private: 14 int a; 15 }; 16 17 int main(){ 18 A a1(1); // a1.get() == 1 19 A a2; // a2.get() == 0 20 a2 = a1; 21 cout << a2.get() <<endl; 22 return 0; 23 } 24 25 // 输出结果 26 // 1
所有博文均为原著,如若转载,请注明出处!