為什麼 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 引用不是物件,只是對目前已經存在...