1. 程式人生 > >C++函數重載和函數模板(04)

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

確定調用 功能 地址 引入 log col int main 設計

函數重載

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

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 類名
{ ... };

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