1. 程式人生 > >25.C++- 泛型編程之函數模板(詳解)

25.C++- 泛型編程之函數模板(詳解)

bsp 構造 指定 idt 可執行 檢查 自動轉換 泛型編程 inf

1)初探函數模板

2)深入理解函數模板

3)多參函數模板

4)重載函數模板


當我們想寫個Swap()交換函數時,通常這樣寫:

但是這個函數僅僅只能支持int類型,如果我們想實現交換double,float,string等等時,就還需要從新去構造Swap()重載函數,這樣不但重復勞動,容易出錯,而且還帶來很大的維護和調試工作量。更糟的是,還會增加可執行文件的大小.

函數模板

  • 一種特殊的函數,可通過不同類型進行調用
  • 函數模板是C++中重要的代碼復用方式
  • 通過template關鍵字來聲明使用模板
  • 通過typename關鍵字來定義模板類型

比如:

當我們使用int類型參數來調用上面的Swap()時,則T

就會自動轉換為int類型.

函數模板的使用

  • 分為自動調用顯示調用

例如,我們寫了一個Swap函數模板,然後在main()函數裏寫入:

初探函數模板

寫兩個函數模板,一個用來排序數組,一個用來打印數組,代碼如下:

運行打印:

為什麽函數模板能夠執行不同的類型參數?

答:

  • 其實編譯器對函數模板進行了兩次編譯
  • 第一次編譯時,首先去檢查函數模板本身有沒有語法錯誤
  • 第二次編譯時,會去找調用函數模板的代碼,然後通過代碼的真正參數,來生成真正的函數
  • 所以函數模板,其實只是一個模具,當我們調用它時,編譯器就會給我們生成真正的函數.

試驗函數模板是否生成真正的函數

通過兩個不同類型的函數指針指向函數模板

,然後打印指針地址是否一致,代碼如下:

運行打印:

可以發現兩個不同類型的函數指針,指向同一個函數模板,打印的地址卻都不一樣,顯然編譯器默默幫我們生成了兩個不同的真正函數

其實函數模板可以定義任意多個不同的類型參數,例如:

註意:

  • 工程中一般都將返回值參數作為第一個模板類型
  • 如果返回值參數作為了模板類型,則必須需要指定返回值模板類型.因為編譯器無法推導出返回值類型
  • 可以從左向右部分指定類型參數

技術分享圖片

接下來開始試驗多參數函數模板

運行打印:

<span "="" src="https://images2018.cnblogs.com/blog/1182576/201804/1182576-20180409165102160-1835121533.png" width="374" height="167">

接下來開始試驗重載函數模板

運行打印:

接下來下章來學習: 26.C++- 泛型編程之類模板(詳解)


文章來源:https://www.cnblogs.com/lifexy/p/8761325.html

25.C++- 泛型編程之函數模板(詳解)