深入C++02:深入學習C++還必須掌握的基礎

booker發表於2022-05-27

?深入學習C++還必須掌握的基礎

掌握形參帶預設的函式

1.給預設值方向:從右向左給預設值;

2.呼叫效率:如果傳預設值或者立即數(不需要從容器或記憶體取取的數字)的話都是直接將數字直接push進棧;沒有mov彙編指令的操作;(面試回答要往彙編上描述)

3.預設值給的地方:定義和宣告處均可以給預設值;

4.形參給預設值的時候,定義是可以多次定義這個函式的,都可以給預設值,宣告的時候也可以給,但是每個引數的預設值只能出現一次;

掌握inline行內函數

函式呼叫開銷:就是彙編生成的一系列指令,生成棧幀,對棧頂和棧底指標不斷操作等,對於函式命令少,執行多次,函式呼叫開銷大,不值得;

1.行內函數和普通函式的區別:①在編譯的過程中沒有函式呼叫開銷(直接在函式呼叫點將函式程式碼展開)②函式也不再生成相應的函式符號(比如sum_int_int那些)③inline這個關鍵字只是建議編譯器處理成行內函數,如果編譯器發現是遞迴(需要知道自己呼叫自己多少次的)或者程式碼量大不適合內聯等,不會設定成行內函數(可以通過檢視符號表中有沒有生成符號);④inline只有再release版本才出現,在debug版本上,inline是不起作用的,因為需要除錯;(面試往原理上回答);

可以檢視符號表的指令:

image-20220319102047992

詳解函式過載

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:

image-20220319111143624

C++:

image-20220319111949240

如何用C++的const實現C的效果:

image-20220319112250220

掌握const和一二級指標的結合應用1\2

1.const和一級指標的結合

const修飾的量(即常量)和 普通變數的區別:①編譯方式不同(會編譯期間替換);②不能作為左值(即不能再改變)

結合情況:

image-20220319115546384

const和指標轉換公式:

image-20220319120221434

經典面試:image-20220319120428777

2.const和二級(多級)指標的結合

多級指標模型:

image-20220319180600855

const和多級指標的型別轉換:(可以採用相同/可推部分消除!)

image-20220319180910173

image-20220319181925739

上面寫錯,紅色最後一句,q是普通指標,賦予存常量的地址,但是*q的型別指明b的值卻是可以改的,違背了b的值不能變,所以不能這樣轉換

消除方法:

1)都轉化為指標,兩邊都只帶有*和const;2)看const是否不參與型別,能不能去掉const; 3)消除等式中相同或者可以推出的部分;4)依據規則看看是否可以型別轉換;

練習:

image-20220319203146897

掌握C++的左值引用和初識右值引用

引用和指標的區別:①從彙編層面回答,兩者操作(定義改值等)都一樣,將變數地址(不能將常量賦值給引用,因為常量沒有地址)存在指標中,用值的時候將指標的地址拿出來然後解引用獲取值;②引用是一種更加安全的指標,引用只有一級引用,指標有多級指標;③引用一開始就要賦值,且後面不能更改,指標沒有這樣的規則;

1.左值引用和右值引用

image-20220319153949638

const、指標、引用的結合使用

const和引用的結合使用看上面;

指標和引用的結合可以將引用還原成指標再去思考問題(不然容易陷入對錯中):

image-20220319203758695

深入理解C++的new和delete

malloc和free是C的庫函式; new和delete是C++運算子;

1.new和malloc的區別?delete和free的區別?

細看初識C++教程筆記

2.new有多少種?

image-20220319160755359

相關文章