在C ++中,
function() = 10;
如果函数通过引用返回变量,则工作,对吗?
有人请详细说明这个吗?
答案 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并返回对它的引用(尽管在重新分配时会变得棘手)