在完成了第三章的學習後,爲了便於往後的複習整理,我製做了一張思惟導圖,有須要的能夠自取。ios
在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
,在函數定義前加上便可將函數嵌入全部調用函數的地方,以此來消除調用函數時產生的時間開銷,適用於簡單且規模小的函數。
內聯函數的定義很是簡單,可是使用時也有一些注意點。
spa
關鍵字inline 必須與函數定義體放在一塊兒才能使函數成爲內聯,僅將inline 放在函數聲明前面不起任何做用。(摘自高質量C++/C 編程指南)3d
C++中的值傳遞與C語言中的值傳遞並沒有兩樣。在發生普通的函數調用時,系統會給形參分配空間並用實參的值給形參初始化。code
因此,對形參的任何改動都不會對實參產生影響,需求的結果都經過返回值傳回。blog
引用是一種特殊類型的變量,可看做另外一個變量的別稱。
對引用的改動會直接反映到被引用的變量上。ci
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++是否提供了想要的函數,均可以訪問cppreference網站查詢。