重載函數

函數重載:

允許多個函數共享一個函數名,每個參數列表唯一(函數簽名唯一)(參數列表個數不一樣, 或則參數類型不同)。

重載條件:

  1. 函數的返回類型不足以區分兩個函數。(在調用的時候一般不指定返回的類型,而且有很大一部分的返回都會進行隱式或則是顯示類型轉換)
  2. 函數的缺省實參不足以區分兩個函數。
  3. 使用typedef類型別名的不足以區分兩個函數(沒有產生新的類型)
  4. 參數修飾符(const volatitle)不足以區分兩個函數。(參數的聲明修飾符號沒有改變傳遞的實參的類型, 可以視爲接受相同的參數集)

重載函數作用:

  1. 爲相同功能的一組函數提供相同的名字,將程序員從複雜的詞彙中解放。
  2. 爲提供不同的參數實例化不同的對象提供了實現的可能,構造函數都是同名的。
  3. 在操作符重載中,豐富了操作符的含義,提供了操作符功能的多重性。

類型安全鏈接:

把參數的個數和類型進行編碼,附加在函數名後面,形成唯一的內部名編碼;編譯系統的底層組建只能看到編碼後的名字。解決了鏈接階段按照函數名區分不同實體時遇到重載函數的尷尬,通過這個機制,鏈接階段區分重載函數就不會出現尷尬。

重載解析:

把函數調用與重載函數集合中的一個函數相關聯的過程。

重載解析(模版實參推演)的三個步驟:

1、 確定重載函數集合(可見域內裏面的每一個候選函數與被調函數同名),此外還要確定被調函數中的參數列表的屬性。
2、從候選函數集合裏面選出一到多個可行函數,如果沒有選出可行函數則無匹配情況。(可行函數:可行函數的參數個數等於或則大於調用函數的參數個數, 多餘的必須是帶缺省實參的;實參與該函數的參數類型存在可以轉換的關係)

     在進行挑選的時候,對可行函數進行劃分等級:

a:精確匹配:實參與函數參數列表類型精確匹配。

符合精確匹配的情況:
從左值到右值的轉換
從數組到指針的轉換
從函數到指針的轉換
限定修飾轉換(隻影響指針):

這裏爲兩個重載函數,而void set(char *const );不是

b:與一個類型轉換匹配。實參不直接與參數類型匹配,但是它能轉換成這樣的類型。
可能的轉換:
提升:char, unsigned char, short, 提升爲int; float提升double; 枚舉類型轉爲int, unsigned int, unsigned long; bool轉化爲int
標準轉換:整值類型的轉換,浮點類型的轉換,浮點-整值的轉換,指針轉換,bool類型的轉換
用戶定義的轉換:

c:無匹配:實參不能與聲明的函數參數匹配,無法進行函數之間的類型轉換。

3、 選擇最佳可行函數(或叫最佳匹配函數)
如果有兩個可行函數要對實參進行標準轉換以匹配各自參數的類型,那麼這個調用就是二義的,被標記爲編譯錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章