函式過載即同一作用域內的幾個函式名字相同但形參列表不同,注意,不允許兩個函式除了返回型別外其他所有的要素都相同。
在大多數情況下,我們容易確定某次呼叫應該選用哪個過載函式,然而,當幾個過載函式的形參數量相等以及某些形參可以由其他型別轉換得來時,就比較複雜了。函式匹配首先是確定候選函式和可行函式,再尋找最佳匹配。
如果有且只有乙個函式滿足下列條件,則匹配成功:
1. 該函式每個實參的匹配都不劣於其他可行函式需要的匹配;
2. 至少有乙個實參的匹配優於其他可行函式提供的匹配。
如果在檢查了所有實參之後,沒有任何乙個函式脫穎而出,則該呼叫是錯誤的,編譯器將報告二義性呼叫的錯誤。
以下程式是乙個驗證:
// 函式匹配
#include "stdafx.h"
#includeusing namespace std;
int main()
//定義過載函式
void f()
void f(int)
void f(int, int)
void f(double,double = 3.14)
程式中首先定義了4個過載函式,這裡,函式只是作測試用,因此只輸出一條區分語句,其它什麼事情都不做。然後以多種方式對函式進行呼叫,分析並驗證哪個函式是最佳匹配,對於呼叫不合法的,分析其原因。
效果如下:
注意,f(42,2.56); 這句**是被遮蔽掉的,因為編譯器會報錯。下面來分析一下為什麼呼叫不合法:
f(42,2.56);中,只考慮第乙個實參42時我們發現f(int, int)能精確匹配,要想匹配f(double,double),int型別的實參必須轉換成double型別。顯然需要內建型別轉換的匹配劣於精確匹配,因此就第乙個實參來說f(int, int)比f(double,double)更好。接著考慮第二個實參2.56,此時f(double,double)是精確匹配,想要呼叫f(int, int)必須將2.56從double型別轉換成int型別,因此就第二個實參來說,f(double,double)更好。編譯器最終將因為這個呼叫具有二義性而拒絕其請求:因為每個可行函式各自在乙個實參上實現了更好的匹配,從整體上無法判斷孰優孰劣。即如下錯誤:
C Primer第五版筆記 虛函式
當我們使用基類的引用或指標呼叫乙個虛成員函式時會發生動態繫結,知道執行時才會知道到底呼叫了哪個版本的虛函式,因此所有的虛函式都必須有定義。對虛函式的呼叫可能在執行時才被解析 物件導向程式設計的核心思想是多型性 polymorphism 多型性這個詞源於希臘語,其含義是 多種形態 引用或指標的靜態型別...
C Primer第五版 練習11 33
練習11.33 實現你自己版本的單詞轉換程式。c primer第五版 練習11.33 2015 10 14 問題描述 練習11.33 實現你自己版本的單詞轉換程式。說明 把書上的程式自己再敲了一遍 include include include include include include usi...
如何學習C primer 第五版
c primer 第一次可以跳著看。關鍵是要盡快用起來,在使用中熟練,而不是在細節中迷失。以c primer第五版為例,第一遍讀的時候 part1也就是前七章,除了6.6,6.7節,都要通讀。尤其是第三章初步介紹了vector和string,簡直就是新手福音,搞定這兩個容器就能寫一些簡單的程式。pa...