鱼C论坛

 找回密码
 立即注册
查看: 637|回复: 14

[已解决]小白求助 拷贝构造函数问题

[复制链接]
发表于 2020-4-21 18:28:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include "iostream"
  2. using std::endl;
  3. using std::cout;
  4. using std::cin;

  5. class Test
  6. {
  7. private:
  8.         int a;
  9.         int b;
  10. public:
  11.         Test(int a = 0, int b = 0)
  12.         {
  13.                 this->a = a;
  14.                 this->b = b;
  15.         }
  16. public:
  17.         Test(const Test& t)
  18.         {
  19.                 this->a = t.a + 10;
  20.                 this->b = t.b + 10;
  21.         }
  22. public:
  23.         void printTest()
  24.         {
  25.                 cout << this->a << " " << this->b << endl;
  26.         }
  27. };

  28. Test fun()
  29. {
  30.         Test t1(11, 22);
  31.         return t1;//第一次调用copy构造
  32. }

  33. void main()
  34. {
  35.         Test t2 = fun();  //第二次调用copy构造 匿名对象转为t2
  36.         t2.printTest();

  37.         system("pause");
  38. }
复制代码

问题 return t1的时候 调用一次copy构造 Test t2 = fun()调用一次拷贝构造 t2.printTest()应该是31,42  才对 为啥是21 32 ?
最佳答案
2020-4-21 19:54:42
这个嘛,你想的东西对了一半。你的这段代码什么时候会发生拷贝构造呢?一定是去调用fun函数的时候,return这个语句生效了会立即拷贝构造一个新对象。
但是,给匿名对象一个名字,这个操作不会用到拷贝构造函数,这里面不会有新对象产生。
你应该是被Test t2=t1这种情况需要调用拷贝构造给迷惑了,这里要拷贝是因为创建新对象t2。但是给匿名对象名字,就像Test t2=&t1一样,只是多个名字,不需要创建新对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-21 18:33:23 | 显示全部楼层
  1. Test fun()
  2. {
  3.         Test t1(11, 22);
  4.         return t1;//第一次调用copy构造  这个是调用匿名对象的拷贝构造函数  
  5. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 18:34:10 | 显示全部楼层
C:\Users\Administrator\Desktop\copy构造疑问.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 18:41:11 | 显示全部楼层

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 18:44:25 From FishC Mobile | 显示全部楼层
本帖最后由 jkluoling1992 于 2020-4-21 18:49 编辑

这个函数就调用了一次构造函数,哪里来的两次呢?,你写的第二次就是第一次调用构造函数并且返回给t2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 19:54:42 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
这个嘛,你想的东西对了一半。你的这段代码什么时候会发生拷贝构造呢?一定是去调用fun函数的时候,return这个语句生效了会立即拷贝构造一个新对象。
但是,给匿名对象一个名字,这个操作不会用到拷贝构造函数,这里面不会有新对象产生。
你应该是被Test t2=t1这种情况需要调用拷贝构造给迷惑了,这里要拷贝是因为创建新对象t2。但是给匿名对象名字,就像Test t2=&t1一样,只是多个名字,不需要创建新对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 20:01:14 | 显示全部楼层
liuzhengyuan 发表于 2020-4-21 18:41
如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)

知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 20:03:14 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-4-21 20:10 编辑

话说我记得你不是很久以前问过一个对象作引用的问题吗?一些需要链式编程的场合才需要返回对象本身,以便能再次合法调用其成员方法。怎么现在倒退了若干步,回到拷贝构造来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 13:45:17 | 显示全部楼层
倒戈卸甲 发表于 2020-4-21 20:03
话说我记得你不是很久以前问过一个对象作引用的问题吗?一些需要链式编程的场合才需要返回对象本身,以便能 ...

你还记得呢 我最近在弄逆向 和 复习以前的知识点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 14:09:27 From FishC Mobile | 显示全部楼层
琴长不过时光 发表于 2020-4-22 13:45
你还记得呢 我最近在弄逆向 和 复习以前的知识点

因为你说你想搞底层,学汇编。很难没印象。c++的内存机制相当复杂,能利用指针进行自由度很大的操控,同时c++又开创了面向对象的各个特性,那都是些未曾删繁就简的原汁原味的语法。所以大家都认为c++是最难的主流编程语言。汇编就更不用说了,贴近机器语言,最难语言这个称号绝对有它的份。
所以其实你很有想法。
不过我内心深处也觉得深入学习c++,学个一年半载能有不少收获,再了解些汇编,能更好理解计算机。可惜我这个身体状况和精神状态都不太能在这两门语言上深入太多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 17:49:16 | 显示全部楼层
倒戈卸甲 发表于 2020-4-22 14:09
因为你说你想搞底层,学汇编。很难没印象。c++的内存机制相当复杂,能利用指针进行自由度很大的操控,同 ...

老弟  你身体咋了  我身体也不好 不能出去打工 只能学学代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 18:02:11 From FishC Mobile | 显示全部楼层
琴长不过时光 发表于 2020-4-22 17:49
老弟  你身体咋了  我身体也不好 不能出去打工 只能学学代码

当初年少轻狂,纵欲过度,如今身体空虚,只能徒然叹息啊
好吧,其实是这些年脑子的思维能力下降了,一些真正有技术性且有创造性的项目明显玩不转。只能往一些靠经验累积的方向发展。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 18:07:01 | 显示全部楼层
倒戈卸甲 发表于 2020-4-22 18:02
当初年少轻狂,纵欲过度,如今身体空虚,只能徒然叹息啊
好吧,其实是这些年脑子的思维能力下 ...

我去 你年龄有我大吗?加个QQ 我QQ7\9\1\9\1\4\7\8\1 验证码我好友发你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 18:08:42 | 显示全部楼层
倒戈卸甲 发表于 2020-4-22 18:02
当初年少轻狂,纵欲过度,如今身体空虚,只能徒然叹息啊
好吧,其实是这些年脑子的思维能力下 ...

我加你好友了 论坛好友 一起学吧
我逻辑能力感觉有点差 不能和17 8岁的小伙子相比
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 18:36:42 From FishC Mobile | 显示全部楼层
倒戈卸甲 发表于 2020-4-22 14:09
因为你说你想搞底层,学汇编。很难没印象。c++的内存机制相当复杂,能利用指针进行自由度很大的操控,同 ...

事业有成就的前提都是身体能够坚持下来,好好锻炼身体啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 00:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表