對比於c 語言的函式,c++增加了過載(overloaded)、內聯(inline)、const 和virtual
四種新機制。其中過載和內聯機制既可用於全域性函式也可用於類的成員函式,const 與
virtual 機制僅用於類的成員函式。
1.過載(overloaded)
過載的理由:
1:在c++程式中,可以將語義、功能相似的幾個函式用同乙個名字表示,即函式過載。
這樣便於記憶,提高了函式的易用性
2:類的建構函式需要過載機制。因為c++規定建構函式與類同名構,造函式只能有乙個名字。如果想用幾種不同的方法建立物件該怎麼辦?別無選擇,只能用過載機制來實現。所以類可以有多個同名的建構函式。
過載的實現:
它們是如何區分的呢?我們自然想到函式介面的兩個要素:引數與返回值。
如果同名函式的引數不同(包括型別、順序不同),那麼容易區別出它們是不同的函式。
如果同名函式僅僅是返回值型別不同,有時可以區分,有時卻不能。例如:
void function(void);
int function (void);
上述兩個函式,第乙個沒有返回值,第二個的返回值是int 型別。如果這樣呼叫函式:
int x = function ();
則可以判斷出function 是第二個函式。
void eat(beef ...);
void eat(fish ...);
void eat(chicken ...);
問題是在c++/c 程式中,我們可以忽略函式的返回值。在這種情況下,編譯器和程式設計師都不知道哪個function 函式被呼叫。所以只能靠引數而不能靠返回值型別的不同來區分過載函式。編譯器根據引數為每個過載函式產生不同的內部識別符號。例如編譯器為上述示例中的三個eat 函式產生象_eat_beef、_eat_fish、_eat_chicken 之類的內部識別符號(不同的編譯器可能產生不同風格的內部識別符號)。
如果c++程式要呼叫已經被編譯後的c 函式,該怎麼辦?
假設某個c 函式的宣告如下:
void foo(int x, int y);
該函式被c 編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字用來支援函式過載和型別安全連線。由於編譯後的名字不同,c++程式不能直接呼叫c 函式。c++提供了乙個c 連線交換指定符號extern「c」來解決這個問題。
例如:extern 「c」
或者寫成
extern 「c」
這就告訴c++編譯譯器,函式foo 是個c 連線,應該到庫中找名字_foo 而不是找_foo_int_int。c++編譯器開發商已經對c 標準庫的標頭檔案作了extern「c」處理,所以我們可以用#include 直接引用這些標頭檔案。
注意:不是兩個函式的名字相同就能構成過載。全域性函式和類的成員函式同名不算過載,因為函式的作用域不同。例如:
void print(...); // 全域性函式
class a
不論兩個print 函式的引數是否不同,如果類的某個成員函式要呼叫全域性函式print,為了與成員函式print 區別,全域性函式被呼叫時應加『::』標誌。如
::print(...); // 表示print 是全域性函式而非成員函式
注意:當心隱式型別轉換導致過載函式產生二義性
第乙個output 函式的引數是int 型別,第二個output 函式的引數是float 型別。由於數字本身沒有型別,將數字當作引數時將自動進行型別轉換(稱為隱式型別轉換)。語句output(0.5)將產生編譯錯誤,因為編譯器不知道該將0.5 轉換成int 還是float 型別的引數。隱式型別轉換在很多地方可以簡化程式的書寫,但是也可能留下隱患。
# include
void output( int x); // 函式宣告
void output( float x); // 函式宣告
void output( int x)
void output( float x)
void main(void)
隱式型別轉換導致過載函式產生二義性
C 函式的高階特性 函式過載
對比於c 語言的函式,c 增加了過載 overloaded 內聯 inline const 和virtual 四種新機制。其中過載和內聯機制既可用於全域性函式也可用於類的成員函式,const 與 virtual 機制僅用於類的成員函式。1.過載 overloaded 過載的理由 1 在c 程式中,可...
C 函式的高階特性
函式過載 編譯器會為每乙個函式產生乙個內部名稱。重新命名機制與函式的形參有關,與函式返回值無關。所以函式過載函式名相同,形參列表不同才能過載。注意 c 程式需要呼叫已經被編譯的c函式,c 提供了乙個c連線交換指示符extern c 來解決這個問題 ifdef cplusplus extern c e...
c 函式的高階特性
c 函式的高階特性 c 中增加了過載 overload 內聯 inline const,virtual四種新機制。其中過載和內聯機制既可以用於全域性函式,也可以用於類的成員函式,const 和virtual 機制僅用於類的成員函式。1.函式過載 c 採用過載的理由 l 可以將語義,功能相似的幾個函式...