本片博客是作者在學習c++的過程中的筆記記錄,希望和各位讀者一起學習交流
引用
-
引用概念:
引用可以看做是一個已定義變量的別名
語法:type & name = var; 通過name可以操作var指向的內存 -
引用是c++的語法範疇
-
普通引用在聲明的時候必須用其他變量進行初始化
引用作爲函數參數聲明時不進行初始化
普通變量做函數參數:在主調函數進行調用的時候,將拷貝一份數據給形參
引用做函數參數:在主調函數進行調用的時候,形參的意思就是實參的別名
指針做函數參數:在主調函數進行調用的時候,將地址傳給形參 -
引用的意義:
引用作爲其他變量的別名而存在,因此一些場合可以替代指針
引用相對於指針有更好的可讀性和實用性 -
引用的本質:(引用在定義的時候就必須進行初始化,而const修飾的常量在定義的時候也必須進行初始化)
- 引用在c++內部實現是一個指針常量
eg:type &name === type *const name - c++編譯器在編譯過程中使用常指針作爲內部的實現,因此引用所佔的空間大小於指針相同
- 從使用的角度,引用會讓人誤會其只是一個別名,沒有自己的存儲空間。這是c++爲了實用性做出的細節隱藏
- 引用在c++內部實現是一個指針常量
-
函數返回值是引用(當返回引用的時候返回的是地址)
1. 當返回的是棧變量(局部變量)的時候,不能成爲其他引用的初始值,不能作爲左值使用,因爲在函數結束的時候,會釋放局部變量,這種返回引用是非法的。
2. 若返回的是靜態變量或者是全局變量的時候(內存空間沒有釋放),既可以作爲右值使用,也可以作爲左值使用
3. 函數返回值和返回引用區別
函數返回值會產生一個臨時變量作爲函數函數返回值的副本,返回引用時返回對象本身(因此可以做左值) -
指針的引用
用法:
int a = 0;
int * b = &a;
int * &c = b; -
常引用:讓變量擁有隻讀屬性
用法:
用變量初始化引用
int a;
const int &b = a;
a = 1;//正確
b = 2;//錯誤
用字面量初始化引用
const int a = 40;//c++編譯器會將a放在符號表中
int &a = 41;//錯誤 引用就是給一個內村起別名,但是41沒有地址
const int &m = 43;//正確,會給43分配內存空間
c++對c的函數擴展
- inline內聯函數
c++中的const常量可以替代宏常數定義
如:const int A = 3; #define A 3
c++中可以使用內聯函數代替宏代碼片段
c++中使用inline關鍵字聲明內聯函數
內聯函數聲明時inline關鍵字必須和函數定義(函數的實現)結合在一起,否則編譯器會直接忽略內聯請求
結論:- 內聯函數在編譯時直接將函數體插函數調用的地方
- inline只是一種請求,編譯器不一定允許這種請求
- 內聯函數省去了普通函數調用時壓棧,跳轉和返回的開始
- 內聯函數不能存在任何形式的循環語句,不能存在過多的條件判斷語句
- 默認參數
- c++可以在函數聲明時爲參數提供一個默認值,當函數調用時沒有指定這個參數的值,編譯器會自動用默認值代替
- 一旦在一個函數調用中開始使用默認參數值,那麼這個參數後的所有參數都必須使用默認值參數
- 函數佔位參數
佔位參數只有參數類型聲明,沒有參數名聲明,一般情況下,在函數體內部無法使用佔位參數 - 函數重載
- 概念
函數名相同,參數不同的函數稱爲函數重載 - 函數重載的判斷標準
函數重載至少滿足下面的一個條件:
參數個數不同、參數類型不同、參數順序不同 - 函數返回值不是函數重載的判斷標準
- 函數調用標準
- 函數重載的本質是相互獨立的不同函數(靜態鏈編)
- 概念
- 函數重載和函數指針結合
當使用重載函數名對函數指針進行賦值時,根據重載規則挑選與函數指針參數列表一致的候選者。嚴格匹配候選者的函數類型與函數指針的函數類型
下面的是筆者的微信公衆號,歡迎關注,會持續更新c++、python、tensorflow、機器學習、深度學習等系列文章