?深入學習C++還必須掌握的基礎
掌握形參帶預設的函式
1.給預設值方向:從右向左給預設值;
2.呼叫效率:如果傳預設值或者立即數(不需要從容器或記憶體取取的數字)的話都是直接將數字直接push進棧;沒有mov彙編指令的操作;(面試回答要往彙編上描述)
3.預設值給的地方:定義和宣告處均可以給預設值;
4.形參給預設值的時候,定義是可以多次定義這個函式的,都可以給預設值,宣告的時候也可以給,但是每個引數的預設值只能出現一次;
掌握inline行內函數
函式呼叫開銷:就是彙編生成的一系列指令,生成棧幀,對棧頂和棧底指標不斷操作等,對於函式命令少,執行多次,函式呼叫開銷大,不值得;
1.行內函數和普通函式的區別:①在編譯的過程中沒有函式呼叫開銷(直接在函式呼叫點將函式程式碼展開)②函式也不再生成相應的函式符號(比如sum_int_int那些)③inline這個關鍵字只是建議編譯器處理成行內函數,如果編譯器發現是遞迴(需要知道自己呼叫自己多少次的)或者程式碼量大不適合內聯等,不會設定成行內函數(可以通過檢視符號表中有沒有生成符號);④inline只有再release版本才出現,在debug版本上,inline是不起作用的,因為需要除錯;(面試往原理上回答);
可以檢視符號表的指令:
詳解函式過載
1.C++為什麼支援函式過載,而C不支援:
C++符號函式名取決於:函式名+引數列表, 而C符號函式名取決於:函式名;
2.函式過載需要注意:
①一組函式,函式名相同,引數列表個數或者型別不同,這組才能稱為函式過載;僅僅返回值不同,必然不是過載;
②注意?一組函式稱得上過載,一定是在同一個作用域中;在函式呼叫點會尋找最近作用域去呼叫;
③const或volatile的時候怎麼影響形參型別:詳細
3.C++和C語言之間如何相互呼叫:
①C++呼叫C:無法直接呼叫,因為兩者產生的函式符號名不一樣;
extern "C" {
int sum(int a, int b)//宣告函式,說明這個函式是在C中宣告的,用C的生成函式符號規則,去尋找;
}
②C呼叫C++:
extern "C" {
int sum(int a, int b) { //在c++裡按照C規則去生成給C用
return a + b;
}
}
③通用方式的程式碼:
#ifdef _cplusplus //_cplusplus是c++內建的巨集(簡單替換),如果是C++編譯器就會進入這個if和endif的程式碼,不是就不會進入;
extern "C" {
#endif
int sum(int a, int b) {
return a + b;
}
#ifdef _cplusplus //同理
}
#endif
多型問題:靜態多型(編譯時期):函式過載; 動態多型(執行時期):後面多型會講到!
全面掌握const的用法
1.const理解
const修飾的變數不能再作為左值!初始化後不能再被修改;
2.C和C++中const的區別是什麼
?const的編譯方式不同,C中const當作一個變數來編譯生成指令;而C++中,所有const常量名字出現的地方,都被常量初始值替換了!!!
C:
C++:
如何用C++的const實現C的效果:
掌握const和一二級指標的結合應用1\2
1.const和一級指標的結合
const修飾的量(即常量)和 普通變數的區別:①編譯方式不同(會編譯期間替換);②不能作為左值(即不能再改變)
結合情況:
const和指標轉換公式:
經典面試:
2.const和二級(多級)指標的結合
多級指標模型:
const和多級指標的型別轉換:(可以採用相同/可推部分消除!)
(上面寫錯,紅色最後一句,q是普通指標,賦予存常量的地址,但是*q的型別指明b的值卻是可以改的,違背了b的值不能變,所以不能這樣轉換)
消除方法:
1)都轉化為指標,兩邊都只帶有*和const;2)看const是否不參與型別,能不能去掉const; 3)消除等式中相同或者可以推出的部分;4)依據規則看看是否可以型別轉換;
練習:
掌握C++的左值引用和初識右值引用
引用和指標的區別:①從彙編層面回答,兩者操作(定義改值等)都一樣,將變數地址(不能將常量賦值給引用,因為常量沒有地址)存在指標中,用值的時候將指標的地址拿出來然後解引用獲取值;②引用是一種更加安全的指標,引用只有一級引用,指標有多級指標;③引用一開始就要賦值,且後面不能更改,指標沒有這樣的規則;
1.左值引用和右值引用
const、指標、引用的結合使用
const和引用的結合使用看上面;
指標和引用的結合可以將引用還原成指標再去思考問題(不然容易陷入對錯中):
深入理解C++的new和delete
malloc和free是C的庫函式; new和delete是C++運算子;
1.new和malloc的區別?delete和free的區別?
細看初識C++教程筆記
2.new有多少種?