gpt4 book ai didi

c++ - 为什么当我试图返回引用时我的对象仍然被复制

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:36 24 4
gpt4 key购买 nike

class Obj {
public:
Obj(int aa, int bb): a(aa), b(bb) {}
Obj(const Obj& o) {a = o.a; b = o.b;std::cout << "copying" << std::endl;}
Obj(Obj&& o) {a = o.a; b = o.b;std::cout << "moving" << std::endl;}
int a;
int b;
};
const Obj& Min(const Obj &o1, const Obj &o2) {
if (o1.a > o2.a) {
return o1;
} else {
return o2;
}
}
int main() {
using namespace std;

auto o1 = Obj(1,1);
auto o2 = Obj(2,2);
auto res = Min(o1, o2);

cout << res.a << endl;
res.a = 100;
cout << o1.a << endl;
cout << o2.a << endl;

return 0;
}

程序仍然打印出一个单词copying,表明复制构造函数被激活。那么构造函数在哪里调用呢?为什么该函数不返回 o1 的引用,以便修改 res 的值也会更改 o1 的值?

最佳答案

复制在声明中完成:

auto res = Min(o1, o2);

Min() 返回类型是 const Obj&。上面的 auto 将被推断为 Obj,而不是 const Obj&(即 res 类型将是 对象)。 res 是一个对象,通过复制构造函数(即 Obj::Obj(const Obj&))进行初始化,因此发生复制构造。

如果你改写:

auto& res = Min(o1, o2)

res 将是 const Obj& 类型,并且不会在那里发生复制构造,因为 res 将是一个引用,而不是一个对象。

关于c++ - 为什么当我试图返回引用时我的对象仍然被复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com