1. 程式人生 > >C++第三章復習與總結(思維導圖分享)

C++第三章復習與總結(思維導圖分享)

自己的 使用 適用於 img 情況下 它的 space ali 默認

技術分享圖片

在完成了第三章的學習後,為了便於日後的復習整理,我制作了一張思維導圖,有需要的可以自取。

函數的定義與使用

帶默認值的函數

在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網站查詢。

C++第三章復習與總結(思維導圖分享)