程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 重載是如何實現的?,重載是實現

重載是如何實現的?,重載是實現

編輯:C++入門知識

重載是如何實現的?,重載是實現


轉自:《高質量C/C++編程指南》 

幾個同名的重載函數仍然是不同的函數,它們是如何區分的呢?我們自然想到函數接口的兩個要素: 參數與返回值。

如果同名函數的參數不同(包括類型、順序不同),那麼容易區別出它們是不同的函數。如果同名函數僅僅是返回值類型不同,有時可以區分,有時卻不能。例如:

      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”
    {
        void foo(int x, int y);
        ... // 其它函數
    }
        或者寫成
    extern “C”
    {
        #include “myheader.h”
        ... // 其它 C 頭文件
    }


        這就告訴 C++編譯器,函數 foo 是個 C 連接,應該到庫中找名字_foo 而不是找_foo_int_int。C++編譯器開發商已經對 C 標准庫的頭文件作了 extern“C”處理,所以我們可以用#include 直接引用這些頭文件。

 

 

 本文轉自CSDN:http://blog.csdn.net/jubincn/article/details/7300141

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved