漫談C 裡的「引用」

2021-08-22 14:18:14 字數 1209 閱讀 1777

引用「&」是c++新增的概念,注意這裡的「&」並不是「取位址」的含義。引用(reference)簡單的說就是乙個物件的別名。用物件來初始化引用後,那麼物件的名字或引用的名字都指向(refer to)該物件,如:

int a=10;

int& ra=a;//ra是a的別名

人們常常會將引用和指標混淆,原因大概是因為c++編譯器通常是採用指標的方式去實現引用的。但引用並不是指標。引用與指標的比較如下:

1.不存在空引用,而指標卻可以是null。

2.所有引用在建立時必須初始化,而指標在定義時不必初始化。

3.乙個引用永遠指向用來對它進行初始化的那個物件,而指標卻可以改變為指向另乙個物件。

另外,需要提醒的是,乙個指向非常量的引用是不可以用字面值常量進行初始化的。如:

double& d=11.3;//錯誤!

然而,乙個指向常量的引用就可以:

const double& cd=11.3;//ok!

看到上面這個語句你也不必奇怪。當乙個指向常量的引用採用乙個字面值來初始化時,該引用實際上指向的是乙個臨時變數,而這個臨時變數採用這個字面值初始化。因此,cd並非真的指向字面值11.3,而是指向乙個採用11.3初始化的、型別為double的臨時變數,並且這個臨時變數將一直保留到cd被銷毀的時候。

乍一看,引用沒有體現其價值,完全沒存在的必要。關於這個問題,我們可以看一下c++之父bjarne stroustrup的名著《the design and evolution of c++》裡有關c++語言裡引入引用的歷史,這會對我們理解引用的作用是很有幫助的。

「引入引用機制主要也是為了支援運算子的過載。」

「c語言對所有函式引數都採用值傳遞,如果用值傳遞物件的效率太低或者不合適,使用者就可以傳遞乙個指標。在有了運算子過載後,採用這種策略就不行了,因為在這種情況下寫法上的方便是最關鍵的東西,對於大的物件也不能指望使用者去加進所需要的取址運算子。例如:

a = b – c;

是可以接受的寫法,但

a = &b - &c;

就不行了。」

引用的主要用途是修飾函式的形參和返回值。在c++中,函式的引數和返回值的傳遞方式有三種:值傳遞、指標傳遞和引用傳遞。引用具有指標的效率,又具有變數使用的方便性和直觀性,而這種方便和直觀性是使用指標所欠缺的。當然,就如bjarne stroustrup所說的,「如果希望在c++裡做更複雜的指標操作,那麼就可以用指標」。但是,如果確實只需要使用一下某個物件的「別名」而已,那麼引用就是不二的選擇了。

C 裡的引用 「 「

在c 裡的三種用法 char a 10 char b 20 char c 0 1.作為二目運算子,位與符。c a b 2.單目運算子,取位址符。char p 0 p a 3.型別與識別符號之間就是引用,x是a的別名 char x a 引用 void fun int x void fun int co...

C 裡的父類物件引用子類例項的理解

物件導向的多型 父類可以引用子類物件。父類引用只能呼叫子類繼承父類的方法,父類引用不能呼叫子類獨有的方法。people newpeople new man bilu 如在 人類 類中引用乙個 男人 例項 子類引用不能直接賦值父類物件,除非將父類物件進行強制轉換 編譯ok,執行異常 man newma...

從彙編的角度看C 裡的引用和指標

c 裡有引用和指標,使用過c 的應該都知道它們的異同點。本文將從彙編的角度去觀察這2者的本質。使用也非常簡單,在左側編寫c 在右側就會直接顯示對應的組合語言,也可以根據需要的平台來選擇對應的編譯器 我們使用的c 如下,比較簡單 int main void 選擇的編譯器是x86 64 gcc 9.2,...