天天看點

C++函數重載和函數模闆(04)

函數重載

函數重載可以使一個函數名具有多種功能,即具有“多種形态”,這種特性稱為多态性。

C++的多态性又被直覺地稱為“一個名字,多個函數”。源代碼隻指明函數調用,而不說明具體調用哪個函數。編譯器的這種連接配接方式稱為動态聯編或遲後聯編。在動态聯編中,直到程式運作才能确定調用哪個函數(動态聯編需要虛函數的支援)。如果編譯器在編譯時,能根據源代碼調用固定的函數辨別符,并用實體位址代替它們,這就稱為靜态聯編或先期聯編。靜态聯編是在程式被編譯時進行的。

函數模闆

1.引入函數模版 由于函數在設計時沒有使用實際的類型,而是使用虛拟的類型參數,故其靈活性得到加強。當用實際的類型來執行個體化這種函數時,就好像按照模版來制造新的函數一樣,是以稱這種函數為函數模闆。将函數模版與某個具體資料類型連用,就産生了模闆函數,又稱這個過程為函數模闆執行個體化,這種形式就是類型參數化。

template <class 形參名,class 形參名,......> 傳回類型 函數名(參數清單)
{
      函數體
}      

    使用顯式規則和關鍵字typename C++專門定義一個僅僅用在模闆中的關鍵字typename,它的用途之一是代替template參數清單中的關鍵字class。

template <typename T>  //定義一個抽象的資料類型T

T myMax(T a, T b) {    //聲明函數模闆

  return a > b ? a : b; 

}

int main () {

  int  a = 2;

  int b = 3;

  std::cout<<myMax(a, b)<<std::endl;  //動态生成函數 int myMax(int , int)

  float c = 2.0f;

  float d = 3.0f;

  std::cout<<myMax(c, d)<<std::endl;  //動态生成函數 flota myMax(float, float)

}      

2.函數模闆的參數 對于一個預設調用,能從函數參數推斷出模闆參數的能力是其中最關鍵的一環。要想省去顯式調用的麻煩,條件是由這個調用的函數參數表能夠惟一地辨別出模闆參數的一個集合。

類模闆

template<class  形參名,class 形參名,…>   class 類名
{ ... };      
類名<模闆執行個體化參數類型> 對象名(構造函數實參清單); 
類名<模闆執行個體化參數類型> 對象名;//預設或者無參數構造函數       

繼續閱讀