龐新法
(陜西省委黨校科技教研部,西安710061)
在C語(yǔ)言中,兩個(gè)函數(shù)的名稱不能相同,否則會(huì)導(dǎo)致編譯錯(cuò)誤。而在C++中,函數(shù)名相同而參數(shù)不同的兩個(gè)函數(shù)被解釋為重載。使用函數(shù)重載可以幫助程序員應(yīng)付更多的復(fù)雜性,避免了使用繁雜的函數(shù)名稱。C++可以對(duì)不同功能賦予相同的函數(shù)名,函數(shù)調(diào)用時(shí),由編譯程序根據(jù)上下文(實(shí)參的類型,個(gè)數(shù))理解確定調(diào)用哪一個(gè),以方便用戶管理和使用函數(shù)名。
自然語(yǔ)言中的“一詞多義”,反映到程序中就是重載。
例1通過(guò)重載求a的絕對(duì)值
C++允許功能相似的函數(shù)在相同的作用域內(nèi)以相同的函數(shù)名聲明,從而形成重載。那么用戶調(diào)用同名函數(shù)時(shí),編譯程序如何確定(匹配)到底調(diào)用哪一個(gè)函數(shù),稱為匹配重載函數(shù)。編譯時(shí),根據(jù)作用域、返回值類型、函數(shù)名、形參類型、形參順序把同名函數(shù)轉(zhuǎn)換成不同名函數(shù)(用函數(shù)內(nèi)部名),內(nèi)部函數(shù)名構(gòu)成規(guī)則:作用域+返回值類型+函數(shù)名+形參列表。匹配重載函數(shù)時(shí)按以下優(yōu)先級(jí)進(jìn)行:①精確匹配:參數(shù)匹配而不做轉(zhuǎn)換,或只做微不足道的轉(zhuǎn)換。②隱式轉(zhuǎn)換匹配。③自定義匹配。④編譯程序?qū)ふ移ヅ浜瘮?shù)時(shí),函數(shù)的類型不起作用。
2.1 重載函數(shù)必須在同一作用域內(nèi)
int abs(int a),double abs(double a),void main()在同一作用域內(nèi),main既可調(diào)用int abs(int a),又可調(diào)用double abs(double a)。int abs(int a),double abs(double a)是重載函數(shù)。
2.2 重載函數(shù)具有不同的形參 不同的形參指的是形參類型不同、形參個(gè)數(shù)不同、形參順序不同。
①形參類型不同。如int add(int x,int y);float add(float x,float y);
②形參個(gè)數(shù)不同。如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);
函數(shù) 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)是重載函數(shù)。
例3 void main()
2.3 精確匹配 實(shí)參形參個(gè)數(shù)相同,類型基本一致稱為精確匹配。例3均為精確匹配。
2.4 隱式轉(zhuǎn)換匹配
2.5 不同功能的函數(shù)不能重載 功能相似的函數(shù),用相同函數(shù)名,以增加可讀性。功能不同的函數(shù),用不同函數(shù)名,便于用戶區(qū)分,是一個(gè)良好的編程風(fēng)格。
非成員函數(shù)可以重載,成員函數(shù)也可以重載,只要函數(shù)在同一作用域內(nèi),滿足重載要求即可。如構(gòu)造函數(shù)重載
重載函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵技術(shù)之一,用于命名一組功能相似的函數(shù),這樣做減少了函數(shù)名的數(shù)量,便于程序的閱讀。函數(shù)重載在類和對(duì)象中的應(yīng)用比較多,在類的多態(tài)性中,有更多不同類型的函數(shù)重載(運(yùn)算符重載)。應(yīng)熟練掌握重載函數(shù),以提高C++編程能力。
[1]錢能.C++程序設(shè)計(jì)教[M].清華大學(xué)出版社,2006.
[2]鄭莉.C++語(yǔ)言程序設(shè)計(jì)[M].清華大學(xué)出版社,2002.
[3]楊俊清.C++程序設(shè)計(jì)[M].西安電子科技大學(xué)出版社,2003.