出現在相同作用域中的兩個函式,如果具有相同名字而形參列表不同,就稱為過載函式,注意,過載函式和返回值無關!!!
在函式中區域性宣告的名字將會遮蔽在全域性作用域內宣告的同名名字。
string init ( ) ;
void func ()
{int init =0;init is local and hides global initl
string s \init ();
由此推論,每乙個版本的過載函式都應該放在同乙個作用於中宣告。
void print ( const string &);
void print ( double );
void func ( int ival)
{void print (int ) ; // new scope:hides previous instances of print;
print ("value");//error : print( const string &)is hidden;
print (ival); //ok
print (3.14);//calls print (int ) ;not print (double);
函式確定的三個步驟
void f();
void f (int );
void f (int . int );
void f(double, double =3.14);
f (5.6);
1 候選函式
首先確定該呼叫所考慮的過載函式的集合,該集合中的函式稱為候選函式。
此例中,有四個名為f的候選函式。
2 選擇可行函式
可行函式必須滿足兩個條件,第一,函式的形參個數於呼叫的實參個數相同;第二,每乙個數、慘的型別必須與相應的形參型別匹配,或者可以被隱式轉換為相應的行參型別。
對於函式呼叫f(5.6), 首先排除兩個實參個數不匹配的候選函式。沒有形參的f和兩個int型形參的f函式。
另外,因為有乙個函式有預設實參,編譯器會自動 將預設實參的值給被忽略的實參,因此某乙個呼叫擁有的實參可能比顯式給出的多。
3 尋找最佳匹配
因為f (double ,double)於實參精確匹配,所以編譯器會呼叫這個。關於最佳匹配的原則,會在一會展開討論。
對於含有多個形參的過載確定
假設有如下函式 f (42,2.56);
在編譯器選出可行函式來之後,如果有且僅有乙個函式滿足下列條件,則匹配成功
(1)其每個實參的匹配都不劣於其他可行函式需要的匹配。
(2)至少有乙個實參的匹配優於其他可行函式提供的匹配。
本例中,如果考慮第乙個實參,發現f( int , int )匹配精確,但是如果考慮第二個實參,那麼f (double ,double)匹配精確,
因此這個呼叫具有二義性。如果想解決這種二義性,可以通過顯式強制轉換來實現。
f ( static_cast < double > ( 42 ) , 2.56 ) ; //calls f(double,double)
f ( 42,static_cast < int > ( 2.56) ) ; //calls f ( int ,int ) .
尋找最佳匹配
為了確定最佳匹配,編譯器將實參型別到相應形參型別的轉換劃分等級,轉換等級以降序排列如下:
(1)精確匹配。 實參和形參型別相同。
(2)通過型別提公升實現的匹配。
(3)通過標準轉換實現的匹配。
(4)通過類型別轉換實現的匹配。
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,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...