考虑一个简单的类,它包装一个数组仅仅是为了提供一个OP可以对返回的引用做什么的例子。
class example
{
private:
int array[]= {1,2,3,4,5,6,7,8,9,0};
public:
int get(int index)
{
return array[index];
}
int & get2(int index)
{
return array[index];
}
}
现在我们不会进入未定义行为的荒地,并可以告诉你这个全副武装和操作参考电源的例子。
说我们有
example x;
我们可以调用获取函数来检索值
int val1 = x.get(1);
int val2 = x.get2(2)
,但我们也可以
x.get2(3) = 30;
因为get2返回一个引用,我们可以分配到它并使任务坚持下去。
这是非常宝贵的,你应该想的索引操作符添加到例如
int & operator[](int index)
{
return array[index];
}
,因为它允许预期的阵列行为
int val = x[5];
x[6] = 10;
编辑
托尼·d带来了另一个重要特征。返回参考由参考。除了允许修改返回的对象之外,这不会创建副本并保存进行副本所耗费的任何努力。对于整数的例子,这是没有意义的。传递一个整数和一个整数的引用的代价要么相同要么相近,以至于无关紧要。对于一个更大,更复杂的对象来说,情况并非如此,这可能需要大量的努力才能进行复制或者无法复制或不应复制的对象。
BigFreakingObject & getBigFreakingObject();
将允许呼叫者,而不会产生重复它的成本上BigFreakingObject
操作。然而,这将交给王国的钥匙,并允许来电者对BigFreakingObject
做任何BigFreakingObject
的许可将允许,这可能与BigFreakingObject
的所有者的要求相冲突。
声明与
const BigFreakingObject & getBigFreakingObject();
或
BigFreakingObject const & getBigFreakingObject();
参考作为const
将提供一个BigFreakingObject
基准但不允许呼叫者来修改它的状态,保护的BigFreakingObject
所有者从任何不愉快的惊喜。
欲了解更多详情,请拨打read up on Const Correctness。
第二个函数暴露未定义的行为。 –
'因为我可以同时使用这两个函数。# – deviantfan
int &&将是一个移动操作。不是你想要的,可能不是语义上正确的。在这里阅读:http://stackoverflow.com/questions/4148341/is-this-correct-usage-of-c-move-semantics – user4581301