能使名字方便使用,是任何程式語言的乙個重要特徵!
我們現實生活中經常會碰到一些字在不同的場景下具有不同的意思,比如漢語中的多音字「重」。
當我們說: 「他好重啊,我都背不動!」我們根據上下文意思,知道「重」在此時此地表示重量的意思。
如果我們說「你怎麼寫了那麼多重複的**? 維護性太差了!」這個地方我們知道,「重」表示重複的意思。
同樣乙個字在不同的場景下具有不同的含義。那麼在c++中也有一種類似的現象出現,同乙個函式名在不同場景下可以具有不同的含義。
在傳統c語言中,函式名必須是唯一的,程式中不允許出現同名的函式。在c++中是允許出現同名的函式,這種現象稱為函式過載。
函式過載的目的就是為了方便的使用函式名。
函式過載基本語法
實現函式過載的條件:
同乙個作用域
引數個數不同
引數型別不同
引數順序不同
//1. 函式過載條件
namespace
a
void myfunc(int a)
void myfunc(string b)
void myfunc(int a, string b)
void myfunc(string b, int a)}//
2.返回值不作為函式過載依據
namespace
b
//int myfunc(string b, int a){}
//無法過載僅按返回值區分的函式
}
注意:函式過載和預設引數一起使用,需要額外注意二義性問題的產生。
void myfunc(stringb)//
函式過載碰上預設引數
void myfunc(string b, int a = 10
)int
main()
思考:為什麼函式返回值不作為過載條件呢?
當編譯器能從上下文中確定唯一的函式的時,如int ret = func(),這個當然是沒有問題的。然而,我們在編寫程式過程中可以忽略他的返回值。那麼這個時候,乙個函式為
void func(int x);另乙個為int func(int x); 當我們直接呼叫func(10),這個時候編譯器就不確定呼叫那個函式。所以在c++中禁止使用返回值作為過載的條件。
函式過載實現原理
編譯器為了實現函式過載,也是預設為我們做了一些幕後的工作,編譯器用不同的引數型別來修飾不同的函式名
,比如void func(); 編譯器可能會將函式名修飾成_func,當編譯器碰到void func(int x),編譯器可能將函式名修飾為_func_int,當編譯器碰到void func(int x,char c),編譯器可能會將函式名修飾為_func_int_char我這裡使用」可能」這個字眼是因為編譯器如何修飾過載的函式名稱並沒有乙個統一的標準,所以不同的編譯器可能會產生不同的內部名。
void func(){}
void func(int x){}
void func(int x,char y){}
以上三個函式在linux下生成的編譯之後的函式名為:
_z4funcv //v 代表void,無引數
_z4funci //i 代表引數為int型別
_z4funcic //i 代表第乙個引數為int型別,第二個引數為char型別
mysql 函式過載 C 方法過載(函式過載)
在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...
C 函式 函式過載
如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...
C 函式過載
函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...