1. 程式人生 > >個人C++速成筆記(1) -- C++與C不一樣的地方:行內函數、預設引數、函式過載、函式模板、庫函式的呼叫

個人C++速成筆記(1) -- C++與C不一樣的地方:行內函數、預設引數、函式過載、函式模板、庫函式的呼叫

之前學過C,現在想稍微學習下C++,由於上班,只能利用平時的空閒時間學習,記錄一下學習歷程,激勵自己有始有終,部落格內容主要記錄C與C++不同的地方。

                                                                                       --始於2018.12.16,終於。。。

1、行內函數(2018.12.16)

 C++提供一種提高函式效率的方法,即在編譯時將被調函式的程式碼直接嵌入到主調函式中,取消呼叫這個環節。這種嵌入到主調函式中的函式稱為行內函數(inline function)。

行內函數的宣告是在函式定義的型別前加上inline修飾符,定義形式為:

inline 返回型別 函式名(形式引數列表)
{
    函式體
}

注意事項:1、行內函數中不允許用迴圈語句和switch語句。2、行內函數的宣告必須出現在行內函數第一次被呼叫之前。

個人體會:該方法和C語言使用巨集定義define來實現的原理(都是編譯時替換)和效果是一樣的,都是可以提高執行效率, 但是都會佔據更大的程式儲存空間。

2、預設引數(2018.12.17)

  C++允許在函式定義或函式宣告時,為形參指定預設值,這樣的引數稱為預設引數(default argument),一般形式為:

返回型別 函式名(...,型別 預設引數名=預設值)
{ 函式體 }

注意事項:1、如果在函式定義時設定了預設引數,那麼就不能在函式宣告中再次設定,反之亦然。2、可以設定多個預設引數,設定的順序為自右向左,換言之,要為某個引數設定預設值,則它右邊的所有引數必須都是預設引數。3、預設值可以是常量、全域性變數,甚至是一個函式呼叫(呼叫實參必須是常量或全域性變數的表示式),不可以是區域性變數。4、預設引數本質上是編譯器根據函式宣告或函式定義時的預設引數設定,對函式呼叫中沒有給出來的實參自動用預設值表示式“補齊”再進行編譯。

個人體會:相較於C,C++提供預設引數這個選項給了函式的更多實現形式,由於經驗不足,尚未知道這種預設引數的好處。

詳細課件:預設引數

3、函式過載(2018.12.17)

函式過載(function overloading)是在同一個域中用同一個函式名來定義多個函式,但函式引數列表應彼此有不同,或者是引數個數不同,或者是引數型別不同,或者兩者均有不同。比如:

注意事項:1、過載函式的形參必須不同(個數不同或型別不同)。2、編譯程式將根據實參和形參的型別及個數的最佳匹配來選擇呼叫哪一個函式。3、不要將不同功能的函式宣告為過載函式,以免出現呼叫結果的誤解、混淆。

個人體會:函式過載使得具有同一功能的一類函式擁有相同的名字,簡直是命名恐懼症患者們的福音,使用這種方法使得使用一個名字就能夠應對不同型別、個數不同的輸入引數。比如:

#include <iostream>
using namespace  std;
int max( int a, int b)  // 整型版本
{
    return  (a>b ? a:b);
}
double max( double a,  double b)  // 雙精度版本
{
    return  (a>b ? a:b);
}
long  max( long a, long b)  // 長整型版本
{
    return  (a> b  ?  a:b);
}

詳細課件:函式過載

4、函式模板(2018.12.18)

函式模板(function template)是一個獨立於型別的函式,可作為一種模式,產生函式的特定型別版本。

使用函式模板可以設計通用型的函式,這些函式與型別無關並且只在需要時自動例項化,從而形成“批量型”的程式設計方式。

函式模板定義的語法形式為:

template<模板形參表> 返回型別 函式名(形參列表)
{
    函式體
}

template<typename T> T abs(T x)
{ 
    return x<0?-x:x; 
}

int main()
{ 
    int n=-5; double d=-5.5;
    cout<<abs(n)<<‘,’<<abs(d)<<endl;
    return 0;
}

模板形參表(template parameter list)是用一對尖括號括< >括起來的一個或多個模板形參的列表,不允許為空,形參之間以逗號分隔,其形式有兩種:

①第一種形式:typename 型別引數名 1, typename 型別引數名,...........(較常用)

②第二種形式:class 型別引數名 1,  class 型別引數名,..............

個人體會:感覺函式模板是函式過載的一個特例,他解決的是同樣的函式名擁有同樣的引數個數,但是引數的型別不一樣的問題。實現也沒有函式過載那麼麻煩。

注:1、模板函式的真正程式碼是在( 源程式中呼叫函式時)時候產生。

5、庫函式的呼叫(2018.12.18)

 所謂庫函式是指事先由別的程式設計師編制好的函式。這裡和C語言差不多,就是呼叫別人實現好的函式,當然這些函式可能 是原始碼可見 的函式,也可能是別人封裝好僅能呼叫 的函式(二進位制庫),你安照說明呼叫就好。