最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++重載的奧義之函數重載詳解

 更新時間:2023年04月18日 10:40:07   作者:Sharemaker  
函數重載是C++多態(tài)(靜態(tài)多態(tài))的特征體現,它可以允許重復使用同一個函數名(籃子)的函數,但是函數的參數列表(籃子裝的東西)是可以不一樣的。下面就簡單講講C++中函數重載的相關應用吧

一、基本定義        

重載,顧名思義從字面上理解就是重復裝載,打一個不恰當的比方,你可以用一個籃子裝蔬菜,也可以裝水果或者其它,使用的是同一個籃子,但是可以用籃子重復裝載的東西不一樣。

函數重載是C++多態(tài)(靜態(tài)多態(tài))的特征體現,它可以允許重復使用同一個函數名(籃子)的函數,但是函數的參數列表(籃子裝的東西)是可以不一樣的。這樣就可以利用函數的重載功能設計一系列功能相近,但是功能細節(jié)不一樣的函數接口。

二、應用舉例        

以同一個函數printData為例:

#include <iostream>
using namespace std;

void printData(const char *str, int num)
{
  //函數體;
}

void printData(const char *str)
{
  //函數體;
}

void printData(double data, int num)
{
  //函數體;
}

void printData(int data, int num)
{
  //函數體;
}

void printData(long data, char num)
{
  //函數體;
}

class Test
{
  public:
         void MyPrint(int num) {cout << "class int: " << num << endl;}
         void MyPrint(float num) {cout << "class float: " << num << endl;}
         void MyPrint(char num) {cout << "class char: " << num << endl;}
};

int main(void)
{
  printData("hello", 5); // (const char *str, int num)
  printData("hello"); // (const char *str)
  printData(1993.0, 97);
  printData(1993, 98);
  printData(1993L, 99);
  Test test1;
  test1.MyPrint(2); // class int: 2
  test1.MyPrint(2.0f); // class float: 2.0 浮點型必須要顯式類型,否則編譯器不知道該轉換為int還是float。
  test1.MyPrint("hello"); // class char: hello
  return 0;
}

使用重載函數時,需要在函數調用中使用與對應的重載函數匹配的函數參數類型。

而如下:

unsigned int para = 4321;
printData(4321, 5);

此時的printData調用和哪個原型匹配呢?答案它不與任何函數原型匹配,而沒有匹配的原型不會停止調用其中某一個函數,C++會嘗試用標準的強制類型轉換與之匹配,比如使用 printData(double data, int num),就可以將para的類型強制轉換為double類型。但是還有printData(int data, int num)和printData(long data, char num)這兩個函數可以強制轉換para。因此,C++將拒絕這種函數的調用,將這種調用視為錯誤。

重載函數通常用在同一個作用域內,用同一個函數名命名一組功能相似的函數,這樣做減少了函數名的數量,提高了函數的通用性,避免了名字空間的污染,對于程序的可讀性有很大的好處。

三、非函數重載的情況

下面這種兩種情況不能視為函數重載:

 int fun(int a);
 int fun(int &a);

從編譯器的角度出發(fā),參數a與參數列表原型int a和int &a都匹配,編譯器無法確定使用哪個函數,為避免這種混亂,編譯器在檢查參數類型時將把類型本身和類型引用看作是同一個特征類型。

int fun(int a, float b);
double fun(int a, float b);

C++不允許這樣的方式重載函數,雖然返回值可以不一樣,但是參數列表必須不一樣。

四、函數重載的使用原則

(1)、僅當函數的基本功能比較相近,但是需要使用不同形式的參數實現功能時才應該使用函數重載,盡量不要用同一函數名去實現完全不相干的功能;

(2)、在同一個作用范圍內使用函數重載,同一個范圍即:同一個命名空間或者同一個類等;

(3)、重載函數的名稱必須相同,函數的參數列表須不相同,即參數列表中參數的類型,參數的個數或參數的順序不相同;

(4)、重載函數可以有相同的返回值類型或者不同的返回值類型,反之僅僅是返回類型不同不足以作為函數的重載。

五、FAQ

1、C++中對函數重載是如何處理的?

在.cpp文件中,雖然兩個函數的函數名一樣,但是,C++編譯器在內部使用“名稱修飾”或“名稱矯正”轉換,它根據函數中參數列表的區(qū)別為每個函數進行加密 ,例如:

int fun(int a, float b)和double fun(int a, float b)

編譯器在內部可以轉換為:

?fun@@YAHHH@Z和?fun@@YAMMM@Z

"?"表示名稱開始,"?"后邊是函數名;“@@YA”表示參數表開始,后邊的3個字符分別表示返回值類型,兩個參數類型;“@Z”表示名稱結束。

由于在.cpp文件中,兩個函數生成的符號表中字符的名稱不一樣,所以是可以編譯通過的。

2、C語言中為什么不能支持函數重載?

編譯器在編譯.c文件時,只會給函數進行簡單的重命名。具體的方法是給函數名之前加上"_”;所以編譯前兩個函數名相同的函數在編譯之后的函數名也照樣相同;因此調用時會因為不知道到底調用哪個而出錯。

int fun(int a, float b)和double fun(int a, float b)

編譯器在內部都轉換為:_fun,無法區(qū)分,

只有不同的函數名字int fun1(int a, float b)和double fun2(int a, float b)

編譯器在內部轉換為:_fun1和_fun2,這才能區(qū)分開來。

以上就是C++重載的奧義之函數重載詳解的詳細內容,更多關于C++函數重載的資料請關注腳本之家其它相關文章!

相關文章

  • C++模擬實現stack和Queue的操作示例

    C++模擬實現stack和Queue的操作示例

    這篇文章主要介紹了C++模擬實現stack和Queue的操作示例,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • C語言詳細分析結構體的內存對齊規(guī)則

    C語言詳細分析結構體的內存對齊規(guī)則

    C 數組允許定義可存儲相同類型數據項的變量,結構是 C 編程中另一種用戶自定義的可用的數據類型,它允許你存儲不同類型的數據項,本篇讓我們來了解C 的結構體內存對齊
    2022-07-07
  • Qt實現數據導出到xls的示例代碼

    Qt實現數據導出到xls的示例代碼

    導入導出數據到csv由于語法簡單,適用場景有限,于是本文將為大家介紹Qt如何實現導出數據到xls,感興趣的小伙伴可以跟隨小編一起試一試
    2022-01-01
  • C++中字符串全排列算法及next_permutation原理詳解

    C++中字符串全排列算法及next_permutation原理詳解

    這篇文章主要為大家詳細介紹了C++中字符串全排列(遞歸法)和(迭代法)以及next_permutation底層原理,文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-02-02
  • C/C++實現重置文件時間戳

    C/C++實現重置文件時間戳

    這篇文章主要為大家詳細介紹了C/C++實現重置文件時間戳的相關資料,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以參考一下
    2023-11-11
  • C++實現LeetCode(39.組合之和)

    C++實現LeetCode(39.組合之和)

    這篇文章主要介紹了C++實現LeetCode(39.組合之和),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言遞歸函數與漢諾塔問題簡明理解

    C語言遞歸函數與漢諾塔問題簡明理解

    遞歸(recursive)函數是“自己調用自己”的函數,無論是采用直接或間接調用方式。間接遞歸意味著函數調用另一個函數(然后可能又調用第三個函數等),最后又調用第一個函數。因為函數不可以一直不停地調用自己,所以遞歸函數一定具備結束條件
    2022-07-07
  • C++演講比賽管理系統(tǒng)實現流程實例

    C++演講比賽管理系統(tǒng)實現流程實例

    這篇文章主要介紹了C++演講比賽管理系統(tǒng)實現流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • C語言之格式化屏幕輸出詳解

    C語言之格式化屏幕輸出詳解

    這篇文章主要介紹了C語言之格式化屏幕輸出的相關資料,需要的朋友可以參考下,小編覺得這篇文章寫的還不錯,希望能夠給你帶來幫助
    2021-11-11
  • 匯編語言rep movsd 的使用詳解

    匯編語言rep movsd 的使用詳解

    rep movsd 每次ecx!=0便執(zhí)行movsd ,然后ecx=ecx-1 movsd移動ds:[si] 到es:[di],在32位匯編下可以用esi代替si,edi代替di
    2013-09-09

最新評論

若尔盖县| 齐河县| 浦城县| 江达县| 伊宁市| 河北区| 邢台县| 湘西| 赤峰市| 哈尔滨市| 章丘市| 聊城市| 阿城市| 尖扎县| 玉门市| 姚安县| 宜黄县| 丽水市| 女性| 美姑县| 西平县| 林西县| 纳雍县| 齐齐哈尔市| 鄂州市| 岢岚县| 英山县| 朔州市| 咸丰县| 阿合奇县| 施秉县| 满城县| 恩施市| 达尔| 花垣县| 繁峙县| 新邵县| 察隅县| 中牟县| 策勒县| 平湖市|