在我原先寫過的《c++——左值、右值、左值引用、右值引用》中有談到引用。
簡單來說,引用是參數的別名,不用額外開闢空間,節省開銷。
舉個例子:左值引用。
int _x = 0;
int &tmp = _x;
在C語言中,左值最初指的是可出現在賦值語句左邊的實體,但這是引入關鍵字const之前的情況。
現在,常規變量和const變量都可視爲左值,無非一個可修改,一個不可修改。
特殊點在於如下demo:
不同的是const + &可接收左值 和 右值。
int _x = 0;
int &tmp1 = _x;
int &tmp2 = 0; //錯誤
const int &rvalue1 = _x;
const int &rvalue2 = 0;
const + &的用處:
- 使用const可以避免無意中修改數據的編程錯誤
- 使用const使函數能夠處理const和非const實參,否則將只能接受非const數據
- 使用const引用使函數能夠正確生成並使用臨時變量。
一、爲何要返回引用
舉個例子:
T & test1(T &x)
{
return x;
}
T test2(T &x)
{
return x;
}
void main()
{
T x, x1, x2;
x1 = test1(x);
x2 = test2(x);
}
test1函數 和 test2函數區別在於 一個 ”&”引用符號。
結果是:
test1 和 test2都執行了賦值運算符函數
而test2多執行了拷貝構造函數
原因在於,在返回的時候,需要構造一個臨時對象tmp(隱式的),將x的內容賦給tmp
等價於T tmp(x)
可見帶有引用的返回節省了開銷。
二、返回引用需要注意的問題
切記引用返回的值需要是形參的值,不要返回局部的值,否則局部變量返回出去,會調用析構函數,再下次調用的時候出現奔潰。
三、爲何將const用於引用返回類型
首先看個demo ,operator[]返回值加上引用&返回的是m_data[i]的數值,作爲左值可以修改。
但是如果加上 const 修飾, 導致 b[1] = 100 不可用。
class B
{
public:
B() { for_each(m_data, m_data + 10, [](int &_data) {_data = 0; }); }
int & operator[](int i) { return m_data[i]; }
void print() { for_each(m_data, m_data + 10, [](int _data) {cout << _data << endl; }); }
private:
int m_data[10];
};
void main()
{
B b;
b.print();
b[1] = 100;
b.print();
system("pause");
}
也就意味着加上const 修飾 返回的是右值不可修改。