C++——你所不知的 const + &

在我原先寫過的《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 修飾 返回的是右值不可修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章