龐新法
(陜西省委黨校科技教研部,西安710061)
在C語言中,兩個函數的名稱不能相同,否則會導致編譯錯誤。而在C++中,函數名相同而參數不同的兩個函數被解釋為重載。使用函數重載可以幫助程序員應付更多的復雜性,避免了使用繁雜的函數名稱。C++可以對不同功能賦予相同的函數名,函數調用時,由編譯程序根據上下文(實參的類型,個數)理解確定調用哪一個,以方便用戶管理和使用函數名。
自然語言中的“一詞多義”,反映到程序中就是重載。
例1通過重載求a的絕對值


C++允許功能相似的函數在相同的作用域內以相同的函數名聲明,從而形成重載。那么用戶調用同名函數時,編譯程序如何確定(匹配)到底調用哪一個函數,稱為匹配重載函數。編譯時,根據作用域、返回值類型、函數名、形參類型、形參順序把同名函數轉換成不同名函數(用函數內部名),內部函數名構成規則:作用域+返回值類型+函數名+形參列表。匹配重載函數時按以下優先級進行:①精確匹配:參數匹配而不做轉換,或只做微不足道的轉換。②隱式轉換匹配。③自定義匹配。④編譯程序尋找匹配函數時,函數的類型不起作用。
2.1 重載函數必須在同一作用域內

int abs(int a),double abs(double a),void main()在同一作用域內,main既可調用int abs(int a),又可調用double abs(double a)。int abs(int a),double abs(double a)是重載函數。
2.2 重載函數具有不同的形參 不同的形參指的是形參類型不同、形參個數不同、形參順序不同。
①形參類型不同。如int add(int x,int y);float add(float x,float y);
②形參個數不同。如int add(int x,int y);int add(int x,int y,int z);
③形參順序不同。如float add(int x,float y);float add(float x,int y);
函數 int add(int x,int y)、float add(float x,float y)、int add(int x,int y,int z)、float add(int x,float y)、float add(float x,int y)是重載函數。
例3 void main()

2.3 精確匹配 實參形參個數相同,類型基本一致稱為精確匹配。例3均為精確匹配。

2.4 隱式轉換匹配

2.5 不同功能的函數不能重載 功能相似的函數,用相同函數名,以增加可讀性。功能不同的函數,用不同函數名,便于用戶區分,是一個良好的編程風格。
非成員函數可以重載,成員函數也可以重載,只要函數在同一作用域內,滿足重載要求即可。如構造函數重載

重載函數是面向對象程序設計的關鍵技術之一,用于命名一組功能相似的函數,這樣做減少了函數名的數量,便于程序的閱讀。函數重載在類和對象中的應用比較多,在類的多態性中,有更多不同類型的函數重載(運算符重載)。應熟練掌握重載函數,以提高C++編程能力。
[1]錢能.C++程序設計教[M].清華大學出版社,2006.
[2]鄭莉.C++語言程序設計[M].清華大學出版社,2002.
[3]楊俊清.C++程序設計[M].西安電子科技大學出版社,2003.