C 中的引用

2021-06-28 18:08:07 字數 2145 閱讀 3153

c++中引用和指標的概念常常被拿來對比,二者之間有非常相似的特性。這給初學者帶來了困擾,特別是很多編譯器使用了指標來實現引用,更增添二者之間撲朔迷離的牽連關係!本文僅就引用的特性做簡要介紹,旨在幫助讀者更好地理解引用的概念和避免常見的錯誤!

不存在空引用所有引用都要初始化引用所指向的物件不可更改

仔細品味以上引用的三大特性,就會發現這三點都是相對於指標而言的。關於這三點,指標有完全相反的特性! 因此以上三點實則也是引用與指標的三大區別!讀者應當仔細品之,並牢記於心,絕大多數對引用的誤用都滋生與對這三大區別的誤解!

引用的三大特性,表面上看似乎是相對於指標的特性總結而來,並與之區別! 但

引用的的本質是別名

確是這三大特性的內在根源, 換句話說引用所指向的物件在賦給引用之前一定要先於引用被建立。這和使用typedef建立型別的別名有異曲同工之妙!

template

< typename t1, typename t2>

class mytype

;int main()

double& d = 10.5; //錯誤

double a = 10.5;

double& d = a; //正確

錯誤在**呢? 要對此有比較深入的理解涉及到左值,右值,左值引用和右值引用的概念。 為了盡快講清楚這個問題, 我們對左值,右值的概念做乙個簡短的介紹。

左值是指表示式結束後依然存在的持久物件

右值對應於臨時物件,表示式結束的時候已經不存在

在乙個賦值表示式中,等號左邊的一般就是左值,右邊的一般就是右值。因此有了左值右值的叫法, 但對於左值右值的判斷切不可以此作為標準,而應該以定義為準!

上述**中d是乙個左值引用, 而10.5顯然是乙個臨時物件,因此是乙個右值。問題來了,乙個非常量左值引用可以繫結到乙個右值物件嗎? 答案是否定的, 我們可以依據c++標準得到這個答案:

c++標準規定非常量左值引用只能繫結到乙個非常量左值

因此上述**中d = a是正確的用法。那麼標準為什麼會這麼規定呢? 設想乙個函式:

void swap( double& d1, double& d2);

...swap(10.0, 1.0);

這段**是不能通過編譯的, 因為顯然他違反了上述規範。 這裡的swap 函式顯然將會修改它的引數,如果我們允許將臨時變數作為引數輸入, 那我們不能獲得修改後的結果。因此輸入的引數必須是已經建立好並初始化的實參,這樣我們才能夠獲得函式修改後的結果!這裡總結一下:

當乙個函式的引數是乙個非常量引用的時候, 程式設計師實際是在暗示編譯器該引用所指向的物件將會被函式修改,因此呼叫者必須確保輸入的實參是乙個左值(非臨時變數)。否則函式所做的修改將無法獲取!為了避免由此所造成的危險和不確定性,c++ 規定在此情形下,臨時變數不可賦給非常量引用。

那麼對於常量左值引用可以繫結到哪些物件呢? 啊, 它簡直是所向披靡,見到誰都可以綁上去!

double d = 2.1;

const

double e = 0.2;

const

double& d1 = d + e;

const

double& d2 = 1.4;

const

double& d3 = d;

const

double& d3 = e;

這些情形下他都完全沒問題!因此下面這段**是可以的:

const

std::string& s = std::string("hello ") + "world!";

那麼這個呢?

std::string& s = std::string("hello ") + "world!";

C 中的引用

最近重新看c 看到些以前沒注意的dd,溫故而知新,暫且記下。引用是能自動間接引用的一種指標,即不必使用間接引用運算子 就可以得到乙個引用值。引用可以為變數起別名,它主要用作函式引數以及函式的返回型別。1 引用的定義 如 int i int j i j是i的引用。1 定義引用時,必須立即對它進行初始化...

C 中的引用

例1 int a int ra a 定義引用ra,它是變數a的引用,即別名 說明 1 在此不是求位址運算,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告引用時,必須同時對其進行初始化。4 引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數...

C 中的引用

引用是c 引入的新語言特性,是c 常用的乙個重要內容之一,正確 靈活地使用引用,可以使程式簡潔 高效。我在工作中發現,許多人使用它僅僅是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。故在本篇中我將對引用進行詳細討論,希望對大家更好地理解和使用引用起到拋磚引玉的作用。一 引用簡...