1. 程式人生 > >函式過載與重複宣告

函式過載與重複宣告

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

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 );


5、typedef 名為現有的資料型別提供了一個替換名它並沒有建立一個新型別因此如果
兩個函式引數表的區別只在於一個使用了typedef 而另一個使用了與typedef 相應的型別
則該引數表不被視為不同的下列calc()的兩個函式宣告被視為具有相同的引數表第二個
宣告導致編譯時刻錯誤因為雖然它聲明瞭相同的引數表但是它聲明瞭與第一個不同的返
回型別
// typedef 並不引入一個新型別
typedef double DOLLAR;
// 錯誤: 相同引數表不同返回型別
extern DOLLAR calc( DOLLAR );
extern int calc( double );

6、

當一個引數型別是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 int& );