C++入門基礎知識(二) -开发者知识库

C++入門基礎知識(二) -开发者知识库,第1张

一:引用

概念:是給一個已經存在的變量取一個別名,編譯器不會為引用變量開辟內存空間,它和引用的變量公用一塊內存空間。

例如:

  類型& 引用變量名(對象名)= 引用實體

  int& a = b;

引用類型必須和引用實體是同種類型的。

 

特性:

  1. 引用在定義時必須初始化

  2. 一個變量可以有多個引用

  3. 引用一旦引用一個實體,再不能引用其他實體

 

引用適用場景:

  1.做參數  void Swap(int& left, int& right) 

  2.做返回值  int& TestRefReturn(int& a) { return a;}

注意:如果函數返回時,離開函數作用域后,其棧上空間已經還給系統,因此不能用棧上的空間作為引用類型 返回。如果以引用類型返回,返回值的生命周期必須不受函數的限制(即比函數生命周期長)。

 

引用與指針的區別:

  1.語法上:

    引用就是一個別名,沒有獨立空間,和其引用實體共用同一塊空間。

  2.底層實現上:

    引用實際是有空間的,因為引用是按照指針方式來實現的。

 

引用和指針的不同點:

  1. 引用在定義時必須初始化,指針沒有要求

  2. 引用在初始化時引用一個實體后,就不能再引用其他實體,而指針可以在任何時候指向任何一個同類型實體

  3. 沒有NULL引用,但有NULL指針

  4. 在sizeof中含義不同:引用結果為引用類型的大小,但指針始終是地址空間所占字節個數(32位平台下占4 個字節)

  5. 引用自加即引用的實體增加1,指針自加即指針向后偏移一個類型的大小

  6. 有多級指針,但是沒有多級引用

  7. 訪問實體方式不同,指針需要顯式解引用,引用編譯器自己處理

  8. 引用比指針使用起來相對更安全。

 

二:內聯函數

  在學習C語言的時候,我們已經學習過了宏函數,但是宏函數的缺點太多,而在C 中,引用了內聯函數來解決這個問題。

學習前先回顧一下宏函數的實現與優缺點:

實現比較大小的宏函數:  #define MAX(a, b) ((a) > (b) ? (a) : (b))

實現加和運算的宏函數:  #define ADD(a, b) ((a) (b))

優點:

  1. 提高了程序的可讀性,同時也方便進行修改;

  2. 提高程序的運行效率:使用帶參的宏定義既可完成函數調用的功能,又能避免函數的出棧與入棧操作,減少系統開銷,提高運行效率;

  3. 宏是由預處理器處理的,通過字符串操作可以完成很多編譯器無法實現的功能。比如##連接符。

缺點:

  1. 由於是直接嵌入的,所以代碼可能相對多一點;不方便調試宏。(因為預編譯階段進行了替換) 

  2. 嵌套定義過多可能會影響程序的可讀性,可維護性差,容易誤用。

  3. 沒有類型安全的檢查 ,對帶參的宏而言,由於是直接替換,並不會檢查參數是否合法,存在安全隱患。

    補充:預編譯語句僅僅是簡單的值代替,缺乏類型的檢測機制。這樣預處理語句就不能享受C 嚴格的類型檢查的好處,從而可能成為引發一系列錯誤的隱患。

宏函數帶來的是大大小小的坑,少一個括號,就有可能進入運算符優先順序問題的坑,但C 中使用了內聯函數要比宏函數好太多

  以inline修飾的函數叫做內聯函數,編譯時C 編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷, 內聯函數提升程序運行的效率

特性: 

  1. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的函數不適宜使 用作為內聯函數。

  2. inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義為inline的函數體內有循環/遞歸等 等,編譯器優化時會忽略掉內聯。

  3. inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址了,鏈接就會找 不到

 三:auto關鍵字:

  在早期的c/c 中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它。

  c 11中新的含義是:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。

注意:在使用auto的關鍵字來定義變量的時候要對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto並非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為量實際的類型。

  auto的使用細則:

  1. auto與指針和引用結合起來使用---用auto聲明指針類型時,用auto和auto*沒有任何區別,但用auto聲明引用類型時則必須加&

 1 #include<iostream>
 2 using namespace std;  3 
 4 int main()  5 {  6     int x = 10;  7     auto a = &x;  8     auto* b = &x;  9     auto& c = x; 10 
11     cout << typeid(a).name() << endl; 12     cout << typeid(b).name() << endl; 13     cout << typeid(c).name() << endl; 14 
15     *a = 20; 16     *b = 30; 17     c = 40; 18 
19     return 0; 20 }

最佳答案:

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » C++入門基礎知識(二) -开发者知识库