C ++按值返回对象

时间:2015-05-29 16:45:17

标签: c++ function return

这个话题几乎就是问题的标题。我在Meyrses的书中看到了这一点" Effective C ++":

  

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

这意味着什么以及C ++标准如何支持该消息?对于实例,请说我们有这样的事情:

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

非常清楚,这句话意味着我们返回存储在局部变量中的值的副本。但请考虑一下:

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

编译器应警告我们返回对局部变量的引用。这是怎样的"以价值事实回归"适用于那个例子?

3 个答案:

答案 0 :(得分:6)

Meyers在主要方面是正确的,但在处理参考文献时你必须用一点点盐来处理这个措辞。在一定程度的抽象中,你在这里传递引用本身"按值"。

但他真正想说的是,除此之外,C ++默认情况下会传递值,这与Java等语言形成对比,在Java中,对象总是被引用语法所取代。

事实上,一个可以认为该段落根本不适用于您的代码,因为该引用不是"对象"。

答案 1 :(得分:2)

当书中说" C ++按值返回对象"时,它解释了当你使用" plain" class name作为返回类型,没有附加"装饰",例如&符号或星号,例如。

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

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

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

请注意,只有在返回指针或对本地对象的引用时,通过指针或引用返回对象才会创建未定义的行为。在其生命周期内访问对象总是会导致未定义的行为。通过引用或指针返回本地可能是导致此未定义行为的最常见错误。

答案 2 :(得分:0)

通过引用返回会给你一个错误,因为你正在将一个变量的引用传递给另一个函数(调用函数foo的函数),这个函数超出了局部变量(变量a)的范围。