8.1.1 過載的起源
自然語言中,乙個詞可以有許多不同的含義,即該詞被過載了。人們可以通過上下文來判斷該詞到底是哪種含義。「詞的過載」可以使語言更加簡練。例如「吃飯」的含
義十分廣泛,人們沒有必要每次非得說清楚具體吃什麼不可。別迂腐得象孔已己,說茴香豆的茴字有四種寫法。
在 c++程式中,可以將語義、功能相似的幾個函式用同乙個名字表示,即函式過載。這樣便於記憶,提高了函式的易用性,這是c++語言採用過載機制的乙個理由。例如示
例8-1-1 中的函式eatbeef,eatfish,eatchicken 可以用同乙個函式名eat 表示,用不同型別的引數加以區別。
c++語言採用過載機制的另乙個理由是:類的建構函式需要過載機制。因為c++規定建構函式與類同名(請參見第9 章),建構函式只能有乙個名字。如果想用幾種不同的
方法建立物件該怎麼辦?別無選擇,只能用過載機制來實現。所以類可以有多個同名的建構函式。
8.1.2 過載是如何實現的?
幾個同名的過載函式仍然是不同的函式,它們是如何區分的呢?我們自然想到函式介面的兩個要素:引數與返回值。
如果同名函式的引數不同(包括型別、順序不同),那麼容易區別出它們是不同的函式。
如果同名函式僅僅是返回值型別不同,有時可以區分,有時卻不能。例如:
void function(void);
int function (void);
上述兩個函式,第乙個沒有返回值,第二個的返回值是int 型別。如果這樣呼叫函式:
int x = function ();
則可以判斷出function 是第二個函式。問題是在c++/c 程式中,我們可以忽略函式的返回值。在這種情況下,編譯器和程式設計師都不知道哪個function 函式被呼叫。所以只能靠引數而不能靠返回值型別的不同來區分過載函式。編譯器根據引數為每個過載函式產生不同的內部識別符號。例如編譯器為示例8-1-1 中的三個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 是全域性函式而非成員函式
8.1.3 當心隱式型別轉換導致過載函式產生二義性
示例 8-1-3 中,第乙個output 函式的引數是int 型別,第二個output 函式的引數是float 型別。由於數字本身沒有型別,將數字當作引數時將自動進行型別轉換(稱為
隱式型別轉換)。語句output(0.5)將產生編譯錯誤,因為編譯器不知道該將0.5 轉換成int 還是float 型別的引數。隱式型別轉換在很多地方可以簡化程式的書寫,但是也可
能留下隱患。
C 函式過載的概念
過載的起源 自然語言中,乙個詞可以有許多不同的含義,即該詞被過載了。人們可以通過上下文來判斷該詞到底是哪種含義。詞的過載 可以使語言更加簡練。例如 吃飯 的含義十分廣泛,人們沒有必要每次非得說清楚具體吃什麼不可。別迂腐得象孔已己,說茴香豆的茴字有四種寫法。在c 程式中,可以將語義 功能相似的幾個函式...
php中過載的概念
class stu stu1 new stu stu1 name xiaoming 屬性不存在 為物件自動新增 stu1 getname 不存在 報錯 上例中 定義了乙個stu類,類內只有 age屬性,當將其實例化後,由於類內未定義name屬性,stu1物件新增了該屬性,並對該屬性賦值。所以相當於該...
函式的過載
在面向過程的程式設計模式下,程式被劃分為資料結構 函式,這也就是那句著名的 程式 資料結構 演算法 的由來 在面向過程的思考方式下,函式名就是最好的標識,而名稱組織良好的函式集合是判斷 是否優美的乙個重要因素 在物件導向的思考方式下,一切都不同了 常見的情況下,應該為不同的函式起不同的名字,但是當這...