C 「引用」詳解

2021-08-08 23:50:33 字數 1921 閱讀 2931

引用是識別符號的「別名」,或者這樣說,如果為乙個物件定義了引用,那麼這個引用就相當於這個物件的「別名」。就類似於有個同學叫王明,但是他還有乙個外號,叫大毛,那麼這個大毛即是王明的別名。模擬推論,引用即是物件的別名。

定義引用一般採取如下形式:型別 & 引用變數名 = 已定義的變數名

需要注意的是:

定義乙個引用的時候,必須同時對它進行初始化,使它指向乙個已存在的物件。

乙個變數可以存在多個引用,即允許乙個變數存在多個別名。

引用在初始化的時候引用一次,便不能再改變去引用其他的變數。

下邊我簡單對引用從用法、作用等方面解析:

一、簡單用法

#include using namespace std;

void test()

int main()

程式執行結果如下圖:

我們可以很清楚的看到,變數a和其引用a所指向的是同乙個位址。所以,當引用a改變時,變數a的值也發生了變化。

如果變數或者引用具有常屬性的話,又會怎麼樣呢?

#include using namespace std;

void test()

int main()

二、引用作參及作為返回值

#include using namespace std;

void swap(int &a, int &b)

int main()

**執行結果:

在這裡,給函式傳參時,進行了應用傳參,所以,函式的形參實際上就是實參的別名,因此可以完成交換。

從上面的例子可以分析有,使用引用傳遞函式的引數,在記憶體中並沒有生成臨時的形參,而是直接對實參操作;而一般值傳遞的時候,在函式呼叫時,要給形參分配新的儲存單元,形參變數是實參變數的臨時拷貝;如果傳遞的是物件,還將呼叫拷貝建構函式;而使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元。

所以,應該注意到:

1. 當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好。

2. 如果不希望函式內部改變引數的值話,則可以在傳參的時候用const進行修飾,變成常引用形參。

3. 如果,要呼叫返回值的話,則也可以根據需要用引用作為函式返回值。

4. 不要返回乙個臨時變數的引用,因為

區域性變數在函式返回後會被銷毀,所以被返回的引用指向了未知的空間,類似於「野指標」,程式會

直接掛掉。

5. 如果返回物件出了當前作用域的話依舊存在,則最好採用引用作為返回值,因為這樣更高效。

三、引用-指標

引用看似和指標一樣,都是指向變數的,而且都能通過其改變變數本身的值,那麼指標和變數是否一致呢?

很明顯,這兩個雖然相似,但是卻並不相同。

簡單總結一下,引用和指標的不同:

引用在定義時,必須進行初始化,即指向有效的變數,不能為空;而定義指標時不必賦值,其可以為空。

引用在定義並初始化後,就不能再去更改引用其他變數;指標變數的值可以隨意改變(前提是沒有const修飾)。

對於引用和指標的++(自增),--(自減)運算,其意義都不一樣。

對引用物件進行sizeof求值,得到的是引用所指向的變數的大小;對指標進行sizeof求值,得到的是物件位址的大小。

引用總結

引用的存在,主要用於在函式引數傳遞中,解決複雜問題內部資料或物件的傳遞效率和空間使用率的問題。

使用引用傳參,可以提高傳遞的效率,而且為了**的安全性,可以通過const的修飾,保證了引用傳遞的安全性。

引用和指向相比較,引用更加安全,也更加高效;而指標比引用靈活,但是也更危險,稍有不對,便會造成很大的錯誤。所以在應用指標時要小心,定義指標時要進行初始化,在指標所指向的位址釋放以後指標最好置空。

C 引用詳解

引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...

C 引用詳解

引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...

C 引用詳解

引用的概念 引用 就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 如下 定義引用ra,它是變數a的引用,即別名。int a int ra a 1 在此不是求位址運算子,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告...