琴长不过时光 发表于 2020-4-21 18:28:22

小白求助 拷贝构造函数问题

#include "iostream"
using std::endl;
using std::cout;
using std::cin;

class Test
{
private:
        int a;
        int b;
public:
        Test(int a = 0, int b = 0)
        {
                this->a = a;
                this->b = b;
        }
public:
        Test(const Test& t)
        {
                this->a = t.a + 10;
                this->b = t.b + 10;
        }
public:
        void printTest()
        {
                cout << this->a << " " << this->b << endl;
        }
};

Test fun()
{
        Test t1(11, 22);
        return t1;//第一次调用copy构造
}

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

        system("pause");
}
问题 return t1的时候 调用一次copy构造 Test t2 = fun()调用一次拷贝构造 t2.printTest()应该是31,42才对 为啥是21 32 ?

琴长不过时光 发表于 2020-4-21 18:33:23

Test fun()
{
      Test t1(11, 22);
      return t1;//第一次调用copy构造这个是调用匿名对象的拷贝构造函数
}

琴长不过时光 发表于 2020-4-21 18:34:10

C:\Users\Administrator\Desktop\copy构造疑问.png

liuzhengyuan 发表于 2020-4-21 18:41:11

琴长不过时光 发表于 2020-4-21 18:34


如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)

jkluoling1992 发表于 2020-4-21 18:44:25

本帖最后由 jkluoling1992 于 2020-4-21 18:49 编辑

这个函数就调用了一次构造函数,哪里来的两次呢?,你写的第二次就是第一次调用构造函数并且返回给t2

倒戈卸甲 发表于 2020-4-21 19:54:42

这个嘛,你想的东西对了一半。你的这段代码什么时候会发生拷贝构造呢?一定是去调用fun函数的时候,return这个语句生效了会立即拷贝构造一个新对象。
但是,给匿名对象一个名字,这个操作不会用到拷贝构造函数,这里面不会有新对象产生。
你应该是被Test t2=t1这种情况需要调用拷贝构造给迷惑了,这里要拷贝是因为创建新对象t2。但是给匿名对象名字,就像Test t2=&t1一样,只是多个名字,不需要创建新对象

琴长不过时光 发表于 2020-4-21 20:01:14

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

知道了

倒戈卸甲 发表于 2020-4-21 20:03:14

本帖最后由 倒戈卸甲 于 2020-4-21 20:10 编辑

话说我记得你不是很久以前问过一个对象作引用的问题吗?一些需要链式编程的场合才需要返回对象本身,以便能再次合法调用其成员方法。怎么现在倒退了若干步,回到拷贝构造来了{:10_256:}

琴长不过时光 发表于 2020-4-22 13:45:17

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

你还记得呢 我最近在弄逆向 和 复习以前的知识点

倒戈卸甲 发表于 2020-4-22 14:09:27

琴长不过时光 发表于 2020-4-22 13:45
你还记得呢 我最近在弄逆向 和 复习以前的知识点

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

琴长不过时光 发表于 2020-4-22 17:49:16

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

老弟你身体咋了我身体也不好 不能出去打工 只能学学代码

倒戈卸甲 发表于 2020-4-22 18:02:11

琴长不过时光 发表于 2020-4-22 17:49
老弟你身体咋了我身体也不好 不能出去打工 只能学学代码

当初年少轻狂,纵欲过度,如今身体空虚,只能徒然叹息啊{:10_256:}
好吧,其实是这些年脑子的思维能力下降了,一些真正有技术性且有创造性的项目明显玩不转。只能往一些靠经验累积的方向发展。

琴长不过时光 发表于 2020-4-22 18:07:01

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

我去 你年龄有我大吗?加个QQ 我QQ7\9\1\9\1\4\7\8\1 验证码我好友发你

琴长不过时光 发表于 2020-4-22 18:08:42

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

我加你好友了 论坛好友 一起学吧
我逻辑能力感觉有点差 不能和17 8岁的小伙子相比

jkluoling1992 发表于 2020-4-22 18:36:42

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

事业有成就的前提都是身体能够坚持下来,好好锻炼身体啊{:10_257:}
页: [1]
查看完整版本: 小白求助 拷贝构造函数问题