當乙個函式在乙個特定的域中被多次宣告時,編譯器解析第二個及後面函式依照下面步驟:
1.引數個數或型別不同,則認為是過載
// 過載函式
void print( const string & );
void print( vector& );
2.函式返回型別和參數列完全相同,則認為第二個函式是第乙個函式的重複宣告
參數列的比較過程與引數名無關
3.如果兩個函式的參數列相同但是返回型別不同則第乙個宣告被視為第乙個的錯
誤重複宣告會被標記為編譯錯誤,例如
unsigned int max( int i1, int i2 );
int max( int , int ); // 錯誤: 只有返回型別不同
函式的返回型別不足以區分兩個過載函式
4.如果在兩個函式的參數列中只有預設實參不同則第二個宣告被視為第乙個的重
復宣告例如
// 宣告同一函式
int max( int *ia, int sz );
int max( int *, int = 10 );
typedef 名為現有的資料型別提供了乙個替換名它並沒有建立乙個新型別因此如果
兩個函式引數表的區別只在於乙個使用了typedef 而另乙個使用了與typedef 相應的型別
則該參數列不被視為不同的下列calc()的兩個函式宣告被視為具有相同的參數列第二個
宣告導致編譯時刻錯誤因為雖然它宣告了相同的參數列但是它宣告了與第乙個不同的返
回型別// typedef 並不引入乙個新型別
typedef double dollar;
// 錯誤: 相同參數列不同返回型別
extern dollar calc( dollar );
extern int calc( double );
當乙個引數型別是const 或volatile 時在識別函式宣告是否相同時並不考慮const 和
volatile 修飾符例如下列兩個宣告宣告了同乙個函式
// 宣告同一函式
void f( int );
void f( const int );
引數是const 這只跟函式的定義有關係它意味著函式體內的表示式不能改變引數的
值但是對於按值傳遞的引數這對函式的使用者是完全透明的使用者不會看到函式對按值
傳遞的實參的改變按值傳遞的實參以及引數的其他傳遞方式在7.3 節中討論當實參
被按值傳遞時將引數宣告為const 不會改變可以被傳遞給該函式的實參種類任何int 型的
實參都可以被用來呼叫函式f(const int) 因為兩個函式接受相同的實參集所以剛才給出的
兩個宣告並沒有宣告乙個過載函式函式f()可以被定義為
void f( int i )
或void f( const int i )
然而在同乙個程式中同時提供這兩個定義將產生錯誤因為這些定義把乙個函式定義
了兩次但是如果把const 或volatile 應用在指標或引用引數指向的型別上則在判斷函式宣告
是否相同時就要考慮const 和volatile 修飾符
// 宣告了不同的函式
void f( int* );
void f( const int* );
// 也宣告了不同的函式
void f( int& );
void f( const
有時候沒有必要過載可能也不需要不同的函式定義在某些情況下預設實參可以
把多個函式宣告壓縮為乙個函式中例如兩個游標函式
moveabs(int,int);
moveabs(int,int,char*);
可以通過第三個char*型引數的有無來區分如果這兩個函式的實現十分類似並且在向
函式傳遞引數時如果能夠找到乙個char*型預設實參可以表示實參不存在時的意義則這兩
個函式就可以被合併現在正好有個這樣的預設實參--值為0 的指標
move( int, int, char* = 0 );
程式設計師最好抱這樣的觀點並不是每個語言特性都是你要攀登的下一座山峰使用語言
的特性應該遵從應用的邏輯而不是簡單地因為它的存在就必須要使用它程式設計師不應該勉
強使用過載函式只有在必要的地方使用它們才會讓人感覺自
解析函式過載
什麼是函式過載?函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。看下面的乙個例子,來體會一下 實現乙個列印函式,既可以列印int型 ...
關於函式過載
什麼是函式過載 所謂函式過載是指同乙個函式名可以對應著多個函式的實現。例如,可以給函式名add 定義多個函式實現,如果乙個函式實現是求兩個整數之和,另乙個實現是求兩個實數之和,再乙個實現是求兩個複數之和。每種實現對應著乙個函式體,這些函式的名字相同,但函式的引數型別不同。為什麼要有過載 假如我們在c...
學習函式的筆記001
函式的特點呢,可以直接呼叫,復用性高 語法def 函式名 塊呼叫 函式名 引數 定義的時候叫形參,呼叫的時候就叫實參了,形參要幾個,實參就要給幾個,要正好 如果有預設值,就可以不傳值,傳了之後展示的是傳的引數,預設引數就是在形參 賦值的 呼叫函式的時候,可以強制賦值給引數 預設引數呢,要放在形參的後...