c++按值返回对象

C++ returns objects by value

本文关键字:对象 返回 c++      更新时间:2023-10-16

问题的主题就在题目中。我在Meyrses的书《Effective c++》中看到了这一点:

c++按值返回对象的事实

这是什么意思? c++标准是如何支持这个消息的?例如,假设我们有这样的内容:

int foo()
{
    int a = 1;
    return a;
}

很明显,这个短语意味着返回存储在局部变量中的值的副本。但是考虑一下:

int& foo()
{
    int a = 1;
    return a;
}

编译器应该警告我们返回对局部变量的引用。"按值返回事实"如何适用于该示例?

Meyers基本上是正确的,不过在处理参考文献时,您必须对这种措辞持保留态度。在某个抽象级别上,这里你是"按值"传递引用本身。

但他真正想说的是,除此之外,c++默认按值传递,这与Java等语言形成对比,在这些语言中,对象总是被引用语义所抛弃。

事实上,一个可以争辩说这段话根本不适用于你的代码,因为引用不是一个"对象"。

当书中说" c++按值返回对象"时,它解释了当你使用"普通"类名作为返回类型而没有额外的"装饰"(如&号或星号)时会发生什么,例如

struct MyType {
    ... // Some members go here
};
MyType foo() {
    ...
}

在上面的例子中,foo()按值返回一个对象。

这个引语不应该暗示c++缺乏从函数返回数据的其他方法:因为你可以很容易地构造一个返回引用或指针的函数。

注意,只有在返回指向局部对象的指针或引用时,通过指针或引用返回对象才会产生未定义行为。访问超过其生存期的对象总是会导致未定义的行为。返回局部的by引用或by指针可能是导致这种未定义行为的最常见错误。

Return by reference会给你一个错误,因为你将一个变量的引用传递给另一个函数(调用函数foo的函数),而这个函数超出了该局部变量(变量a)的作用域。