C++第三章複習與總結(思維導圖分享)
在完成了第三章的學習後,為了便於日後的複習整理,我製作了一張思維導圖,有需要的可以自取。
函式的定義與使用
帶預設值的函式
在C++中我們可以為函式新增預設的引數值,在呼叫時可不傳入或部分傳入引數,為傳入的部分便會採用預設值。
帶預設引數的函式可以放在main函式前。
#include <iostream> using namespace std; int add(int a = 5, int b = 6) { return a + b; } int main(void) { cout<<add(); return 0; }
也可把函式放在main函式後,將預設值放在函式宣告中。
這種情況下,預設值只可出現在函式宣告中,不可出現在函式定義中
#include <iostream> using namespace std; int add(int a = 5, int b = 6); int main(void) { cout << add(); return 0; } int add(int a, int b)//add(int a = 5,b = 6)為錯誤寫法 { return a + b; }
行內函數
C++中添加了一個新的關鍵字 inline
,在函式定義前加上即可將函式嵌入所有呼叫函式的地方,以此來消除呼叫函式時產生的時間開銷,適用於簡單且規模小的函式。
行內函數的定義非常簡單,但是使用時也有一些注意點。
關鍵字inline 必須與函式定義體放在一起才能使函式成為內聯,僅將inline 放在函式宣告前面不起任何作用。(摘自高質量C++/C 程式設計指南)
引數傳遞
值傳遞
C++中的值傳遞與C語言中的值傳遞並無兩樣。在發生普通的函式呼叫時,系統會給形參分配空間並用實參的值給形參初始化。
所以,對形參的任何改動都不會對實參產生影響,需求的結果都通過返回值傳回。
引用傳遞
引用是一種特殊型別的變數,可看作另一個變數的別稱。

對引用的改動會直接反映到被引用的變數上。
函式過載
C++中的函式過載允許我們使用相同的函式名卻使用不同資料型別的資料與返回值,在進行函式呼叫的時候,編譯器會自動根據資料型別選擇合適的函式。
普通的函式過載
一般的函式過載要求我們為每一個數據型別寫一個函式,函式名相同,只有引數的資料型別和返回值的資料型別不同。
比如我要實現一個add函式,可以對 double
int
complex
實現相加操作。
#include <complex> #include <iostream> using namespace std; int add(int, int); double add(double, double); complex<double> add(complex<double>, complex<double>); int main() { int a = 1, b = 5; double x = 1.12, y = 5.36; complex<double> m{2.2, 5.4}; complex<double> n{3.5, 2.1}; cout << add(a, b) << endl; cout << add(x, y) << endl; cout << add(m, n).real() << "+" << add(m, n).imag() << "i" << endl; return 0; } int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } complex<double> add(complex<double> a, complex<double> b) { return a + b; }
就可以實現這樣的輸出,函式的使用更加符合人們日常生活中的邏輯了。

用函式模板實現函式過載
還是覺得麻煩?
C++中有一個更方便的方法,就是使用函式模板。但是函式模板有它的缺點,就是隻有除了資料型別不同,其他程式碼一模一樣的函式才能使用函式模板合併,我們上文中例子裡的三個函式剛好都符合,那麼就可以使用函式模板將他們合併。
#include <complex> #include <iostream> using namespace std; template <typename T> T add(T a, T b) { return a + b; } int main() { int a = 1, b = 5; double x = 1.12, y = 5.36; complex<double> m{2.2, 5.4}; complex<double> n{3.5, 2.1}; cout << add(a, b) << endl; cout << add(x, y) << endl; cout << add(m, n).real() << "+" << add(m, n).imag() << "i" << endl; cin.get(); return 0; }
這樣,我們只需要寫一遍邏輯就可以多處重複使用,程式碼也更加簡潔易讀。事實上用函式模板寫的函式在使用時也可以指定資料型別 add<typename>()
,但為了方便使用,我們一般讓編譯器從傳遞給函式的實參推斷型別引數,這一功能被稱為 模板實參推斷
。
C++系統函式
除了直接可以根據需求寫出我們自己的函式,C++的系統庫為我們提供了幾百個函式。要使用它們,只需要將函式所在的標頭檔案包含進我們直接的原始檔中,便可以直接呼叫。要知道函所在的標頭檔案或者想知道C++是否提供了想要的函式,都可以訪問 cppreference 網站查詢。