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
赋值构造函数实例(值传递)

 

posted on 2019-05-04 15:01  爱笑的张飞  阅读(3405)  评论(0编辑  收藏  举报

导航