C 函式的高階特性 函式過載

2021-05-25 09:43:41 字數 2020 閱讀 1834

**: //

對比於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 可以將語義,功能相似的幾個函式...