天天看點

個人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)是在同一個域中用同一個函數名來定義多個函數,但函數參數清單應彼此有不同,或者是參數個數不同,或者是參數類型不同,或者兩者均有不同。比如:

個人C++速成筆記(1) -- C++與C不一樣的地方:内聯函數、預設參數、函數重載、函數模闆、庫函數的調用

注意事項: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語言差不多,就是調用别人實作好的函數,當然這些函數可能 是源碼可見 的函數,也可能是别人封裝好僅能調用 的函數(二進制庫),你安照說明調用就好。