C 引用與指標

2021-10-03 03:45:27 字數 1759 閱讀 2450

為什麼 c++ 有指標了還要引用?

因為加入引用是為了支援operator overloading。這裡有乙個假設,如果沒有引用,那麼,用指標來operator overloading操作。

a operator +(const a *a, const a *_a);

那麼使用的時候,&a + &b,這樣看起來是不是很難受。

而引入引用的概念,既可以滿足overload operator,也不失過載value和pointer的靈活性。而且引用還帶來乙個指標無法替代的特性: 引用臨時物件。因為引用必須在定義的時候就賦值,以後無法更改。

發布於 2015-08-24・著作權歸作者

緋村劍心

1我覺得根本是為了解決函式返回值不能是左值的問題 有了引用後可以對表示式賦值

c++為啥要有引用?

因為運算子過載。

c++為啥要有異常?

因為沒辦法返回乙個「空引用」。

因為引用是編譯器層的東西, 編譯完後並不會占用真正的記憶體. 而指標是個資料, 是要單獨占用記憶體儲存的.

更新一下:

說"引用編譯玩後不會佔記憶體",這種說法不太嚴謹. 應該說引用是個概念, 概念本身不佔記憶體. 而實現引用的通常方式為儲存其引用物件的指標,而此指標會佔記憶體,但不是引用佔的記憶體了.

就像類本身不佔記憶體, 但物件會佔記憶體一樣,

本來之父也和你一樣想的,有指標就夠了,一樣能實現相應的功能,沒必要再多乙個語法設施。但後來為了加運算子過載,沒有引用的話,前自增的語義就難以說明清楚,這是引入引用概念的歷史背景。後來你可以發現,線性容器所過載的下標運算子,迭代器和智慧型指標所過載的間接訪問運算子,輸入流和輸出流的鏈式呼叫,這一切都是離不開引用語義的。

拋開運算子過載的歷史因素,引用在大多數場合下完全可以視作指標的語法糖——在底層的彙編的層面講他們是一樣實現的。不過有了引用以後,確實寫**可以方便很多。比如最常見的手法就是利用引用免掉一階的指標。在 c 裡面,你要在函式中修改乙個一級指標,形參裡得宣告成二級指標,但在 c++ 裡形參宣告成一級指標的引用就可以了。別看只是降了一階,但人類的思維理解高維的概念很困難,問題降一階以後考慮問題就可以輕鬆很多。

有了引用以後,**也變得簡練。以前在 c 裡,如果要設計乙個函式處理大物件,則不得不以指標做引數,那就不得不宣告臨時變數去儲存中間結果。

matrix a, b, c;

getmatrixa(&a);

getmatrixb(&b);

addmatrix(&a, &b, &c);

printmatrix(&c);

而在 c++ 裡,則完全不需要考慮這些,完全可以以引用當引數,**又清晰,又不用擔心會拷貝而帶來效率瓶頸。

print(addmatrix(getmatrixa(), getmatrixb()));

引用是很早就有的 c++ 概念,可以視為指標的語法糖。

右值引用是c++11 裡面為了移動語義提出的,也就是和這種型別: t&&。

移動語義就是為了提高執行時效率,相對於拷貝和賦值提出了一種更高效的可選的實現策略,這樣就能通過 std::move 明確指示編譯器執行資源資料的移動,而不是拷貝。這樣就提高了效率。也就是說,如果只有引用,那麼編譯器「並不敢」擅自使用移動來完成拷貝,賦值這個動作(移動意味著源物件會變成乙個「空殼子「),因為它不知道使用者是否將來還會再用到這個物件。

引入 t&& 的意思就是明確的告訴編譯器,我這個物件後續就不用了,你放心的移動吧!

此外就是 std::forward 是為了讓模板可以正確推斷成右值引用而使用移動語義優先。

至於什麼是左值,右值,就到 value categories 去查詢吧。

C 指標與引用

include 引用傳遞 int add1 int x,int y 指標傳遞 int add2 int x,int y 值傳遞 int add3 int x,int y void main int a 1 int b a 引用,表示b的引用指向了a 定義引用 開頭 必須賦初值 引用變數不占用記憶體 ...

C 指標與引用

從函式引數傳遞說起 int addition int x,int y int main void duplicate int a,int b int main 按值傳遞,顧名思義,函式形參僅僅得到變數傳來的值,函式的任何操作並不對變數產生任何變化 按位址傳遞,他的定義方式與按值傳遞不一樣 注意其在m...

C 引用與指標

1 引用即給當前物件起了個別名,通過將宣告符寫成 t c的形式來定義引用,其中t是變數名,c是當前物件的名字 修改別名相當於修改當前物件,引用必須初始化,且不能更改指向物件 example int a 10 定義a及初始化 int c a 定義a的引用c cout2 引用不是物件,只是對目前已經存在...