考慮一個簡單的類,它包裝一個數組僅僅是爲了提供一個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