考虑一个简单的类,它包装了一个数组,其目的只是为了提供 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;
EDIT
托尼·D 提出了另一个重要特征。返回引用返回by参考。除了允许修改返回的对象之外,这不会创建副本并节省了创建副本所消耗的任何精力。对于整数的示例情况,这是没有意义的。传递整数和对整数的引用的成本要么相同,要么非常接近,以至于无关紧要。对于可能需要花费大量精力来复制的更大、更复杂的对象或不能或不应该复制的对象,情况并非如此。
BigFreakingObject & getBigFreakingObject();
将允许调用者操作BigFreakingObject
无需承担重复的成本。然而,这会移交王国的钥匙,并允许调用者执行以下操作:BigFreakingObject
任何BigFreakingObject
的权限将允许,这可能与以下的要求相冲突BigFreakingObject
的主人。
将引用声明为const
with
const BigFreakingObject & getBigFreakingObject();
or
BigFreakingObject const & getBigFreakingObject();
将提供一个参考BigFreakingObject
但不允许调用者修改其状态,保护所有者BigFreakingObject
免受任何不愉快的意外。
有关这方面的更多详细信息,阅读常量正确性 https://isocpp.org/wiki/faq/const-correctness.