函数通过引用返回变量?

时间:2009-11-16 18:34:22

标签: c++

在C ++中,

function() = 10;

如果函数通过引用返回变量,则工作,对吗?

有人请详细说明这个吗?

7 个答案:

答案 0 :(得分:15)

首先考虑这段代码

int *function();
...
*function() = 10;
看起来很相似,不是吗?在此示例中,function返回指向int的指针,您可以通过对其应用一元*运算符以上述方式使用它。

现在,在这个特定的上下文中,您可以将引用视为“伪装指针”。即引用是一个“指针”,除了您不需要将*运算符应用于它

int &function();
...
function() = 10;

一般来说,将引用等同于指针并不是一个好主意,但对于这个特殊的解释,它的效果非常好。

答案 1 :(得分:7)

考虑以下代码,MyFunction返回一个指向int的指针,并将值设置为int。

int  *i;
i = MyFunction();
*i = 10;

到目前为止,你和我在一起吗?

现在将其缩短为

*(MyFunction()) = 10;

它与第一个代码块完全相同。

您可以将引用视为一个始终取消引用的指针。因此,如果我的函数返回一个引用 - 而不是一个指针 - 到一个int,frist代码块将成为

int  &i;
i = MyFunction();
i = 10;

,第二个将成为

MyFunction() = 10;

你还和我在一起吗?

答案 2 :(得分:2)

通过一个小实验,您可以确定这是否有效。

考虑这个例子:

class foo {
    private:
        int _val;
    public:
        foo() { _val = 0; }
        int& get() { return _val; }
        void print() { printf("val: %d\n", _val); }
};

int main(void) {
    foo bar;
    bar.print();
    bar.get() = 10;
    bar.print();
}

它的输出是:

val: 0
val: 10

当然,可以返回参考。请注意,被引用的变量可能超出范围,然后您的调用者可能会获得垃圾结果(就像解除引用指向超出范围的对象的指针一样)。所以这很糟糕:

int& get() {
    int myval = _val;
    return myval;
}

答案 3 :(得分:1)

这个问题的答案与 rvalue 语义与 lvalue 语义有关。 C ++中的每个值都是左值或右值。左值是存储在可寻址存储器位置的值,这意味着它们是可分配的(当然,假设它们是非常量的。)rvalue基本上是其他任何东西,例如文字常量或不可寻址的临时值。

因此,返回非const引用的函数是左值。但是,按值返回的函数将是 rvalue 表达式,因为它返回一个不可寻址的临时值,因此不可分配。

有关更详细的说明,请参阅wikipedia条目。

答案 4 :(得分:1)

你没有问的问题。
但是你为什么要那样做?

想想std :: vector(我将原理扩展到方法)。

这里有方法'operator []()'它返回对内部成员的引用 然后允许以下内容:

std::vector<int>  x(20,1);
x[5] = 10;

// This is quivalent to:
x.operator[](5) = 10;

// So this is just a function (method) call:
x.function(5) = 10;

答案 5 :(得分:0)

正如其他人所说,函数可以返回对成员变量的引用,但要注意:这个函数不应该是类接口的一部分。一旦你提供了一个返回类的内部参考的函数,你就失去了对它们的控制。 如果您尚未阅读“Effective C ++”,请执行此操作。 该书的第29项说“避免返回”处理“内部数据”并更详细地解释了为什么需要避免这种做法。

答案 6 :(得分:0)

回复参考时的警告:注意你回来的生命。这个例子很糟糕:

int &function()
{
    int x;
    // BAD CODE!
    return x;
}
...
function() = 10;

x不存在于function之外,也没有任何引用。为了从函数返回引用,被引用的对象必须至少与引用一样长。在上面的例子中,x需要声明为static。其他可能性是使x成为一个全局变量,或者使函数成为类成员函数并返回对类成员变量的引用,或者在堆上分配x并返回对它的引用(尽管在重新分配时会变得棘手)