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   爱笑的张飞  阅读(3412)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示