我有以下方法按值返回本地声明的对象:
Human Human::getLocalDeclaredHuman() {
Human human;
std::cout << &human << std::endl;
return human;
}
我调用这个方法:
Human a;
Human b = a.getLocalDeclaredHuman();
std::cout << &b << std::endl;
std::cout << b.getName() << std::endl;
这是运行程序的输出:
0x22fe58
0x22fe58
李四
因此在方法中声明为本地的变量 human
与变量 b 具有相同的地址。我认为 return-by-value
将创建对象的拷贝,并且对象 b 有另一个地址,就像在本地声明的对象 human 一样。
我的问题:
如果这里的b和human有相同的地址,按值返回和按引用返回的区别在哪里?
最佳答案
与其说是调用者收到了对被调用者局部变量的引用,不如说是编译器将对调用者变量的引用偷偷放到了被调用者中!
getLocalDeclaredHuman.human
从未真正存在过。编译器能够优化它的存在并直接在 b
上完成所有工作。
并且,直接回答您的问题,“按值返回和按引用返回之间的区别在哪里?”:在这种情况下,按值返回意味着单个对象的生命周期为 b
。如果您要通过引用返回 human
,则该单个对象将具有 human
的生命周期,即当 getLocalDeclaredHuman()
返回时它将被销毁.
关于c++ - 按值返回的变量的相同地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400018/