關於函數重載解析筆記001

當一個函數在一個特定的域中被多次聲明時,編譯器解析第二個及後面函數依照下面步驟:

1.參數個數或類型不同,則認爲是重載
 // 重載函數
 void print( const string & );
 void print( vector<int> & );
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 );
程序員最好抱這樣的觀點並不是每個語言特性都是你要攀登的下一座山峯使用語言
的特性應該遵從應用的邏輯而不是簡單地因爲它的存在就必須要使用它程序員不應該勉
強使用重載函數只有在必要的地方使用它們纔會讓人感覺自

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章