考虑一个包装数组的简单类,仅用于提供一个示例,说明 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;
我们可以调用任一 get 函数来检索值
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;
编辑
Tony D 提出了另一个重要特征。返回一个引用返回 by 引用。除了允许修改返回的对象之外,这不会复制并节省复制所消耗的任何精力。对于整数的示例情况,这是没有实际意义的。传递整数和对整数的引用的成本将相同或非常接近以至于无关紧要。对于可能需要大量工作来复制的更大、更复杂的对象或不能或不应该复制的对象,情况并非如此。
BigFreakingObject & getBigFreakingObject();
将允许调用者对BigFreakingObject 进行操作,而不会产生复制它的成本。然而,这会将钥匙交给王国,并允许调用者对BigFreakingObject 执行任何BigFreakingObject 的权限允许的操作,这可能与BigFreakingObject 的所有者的要求相冲突。
使用
将引用声明为
const
const BigFreakingObject & getBigFreakingObject();
或
BigFreakingObject const & getBigFreakingObject();
将提供对BigFreakingObject 的引用,但不允许调用者修改其状态,从而保护BigFreakingObject 的所有者免受任何令人不快的意外。
更多详情,read up on Const Correctness。