您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++中的引用與關鍵字auto怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++中的引用與關鍵字auto怎么使用”吧!
引用就是給一個已經存在的變量取一個別名,與變量共用一段內存空間。注意引用的類型必須和變量類型相同,來演示下引用如何使用。
#include <iostream> using namespace std; int main() { int a = 1; int& b = a; int& c = b; int& d = c; cout << &a << endl; cout << &b << endl; cout << &c << endl; cout << &d << endl; return 0; }
如上面的代碼所示:我們給a取了個別名b,給b取別名c…也就是b是a的引用,c是b的引用…。其實b,c,d都代表著a,它們都共用著一塊內存空間。
如下圖所示:
引用的注意事項:
引用必須初始化
引用不能更改
一個變量可以有多個引用
引用可以作為函數的參數也可以做返回值,在之前學習C語言我們常使用指針傳參,也就是傳址調用來改變外部變量的值。學習引用后,我們只用引用傳參就會特別方便。
當返回引用時,就會引出很多問題,這里我們來解析下下面的代碼:
int& Add() { int n = 0;//靜態變量static int a = 0; n++; return n; } int main() { int ret=Add(); cout << ret << endl; return 0; }
n在Add函數中變為1,Add返回了n的引用,我們用變量ret來接收n的引用也就是n的值,但是有個問題就是——n在出Add函數后,函數棧幀如果被清理的話,函數返回引用找到的值就會是隨機值。如果棧幀沒有被清理,那ret僥幸是正確的1。為了避免這種情況我們可以將Add函數的n設為靜態變量。
為了驗證,我們再看一下面的代碼:
int& Add(int x) { int n = x; n++; return n; } int main() { int& ret=Add(10); cout << ret << endl; Add(20); rand(); cout << ret << endl; return 0; }
假設出Add函數后棧幀不破壞那打印結果就是11\n21,但是我們調用個函數,模擬函數棧幀破壞的情況,那結果是不是像我們預想的那樣為隨機值呢。
總結
引用傳參適合大部分的情況
將引用返回值時需要注意引用對象還是否出函數是否還存在。
下面我們來看引用使用場景及其優點:
1.引用做參數-(輸出型參數)
2.引用做參數-(減少拷貝提高效率) (大對象/深拷貝類對象)
3.引用做返回值-(減少拷貝提高效率) (大對象/深拷貝類對象)
4.引用做返回值-修改返回值+獲取返回值
接下來再講一下常引用、引用權限的放大、縮小、平移:
int func() { stctic int a=0; a++; return a; } int main() { //引用的權限可以平移和縮小不可以放大 int a = 0; int& b = a;//平移 const int& c = a;//縮小 ++a; ++c;//放大 const int a = 10; int& b = a;//只能給變量取別名 double c = 3.14; int& d = c;//引用的類型需要匹配 const int& e = c;//類型轉換會創建臨時變量 臨時變量具有常量性質 int& ret=func();//權限放大 return 0; }
語法層面上引用不會開空間知識對變量取得一個別名,而從底層匯編指令來看的話引用是類似指針的方式使用的。
引用和指針有許多不同點:
引用需要初始化,指針不要求
引用不能修改,指針可以
有空指針,沒有空引用
引用更為安全,指針可能出現野指針和越界等情況
在sizeof中引用是類型的字節大小,指針是根據機器位數來判斷字節個數
引用在語法上定義一個變量的別名,指針儲存一個變量的地址
有多級指針沒有多級引用
指針需要根據地址解引用訪問,引用是編譯器自己處理的
auto可以自動識別類型,當類型過于復雜冗長時,auto使用起來非常的方便。
int main() { int a = 1; auto b = 10; auto c = 3.14; }
在同一行定義多個變量時,需要注意同一行的變量類型要一致,不然auto無法正確識別:
int main() { auto a = 1, b = 2; auto c = 3, d = 4.0;//類型不同 }
auto還不能作為函數的參數以及定義數組
auto還有個重要的應用范圍for循環
他提供了一種更簡便的for遍歷的方法根據冒號”:”分為兩部分:第一部分是范圍內用于迭代的變量,第二部分則表示迭代的范圍。
int main() { int arr[] = { 0,1,2,3,4,5,6 }; for (auto x : arr) cout << x << endl; }
感謝各位的閱讀,以上就是“C++中的引用與關鍵字auto怎么使用”的內容了,經過本文的學習后,相信大家對C++中的引用與關鍵字auto怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。