在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中函數(shù)重載的使用

CHANBAEK ? 來源:明解嵌入式 ? 作者:Sharemaker001 ? 2023-04-15 11:22 ? 次閱讀

重載,顧名思義從字面上理解就是重復(fù)裝載,打一個(gè)不恰當(dāng)?shù)谋确剑憧梢杂靡粋€(gè)籃子裝蔬菜,也可以裝水果或者其它,使用的是同一個(gè)籃子,但是可以用籃子重復(fù)裝載的東西不一樣。

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

#include 
using namespace std;


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


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


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


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


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


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 浮點(diǎn)型必須要顯式類型,否則編譯器不知道該轉(zhuǎn)換為int還是float。
  test1.MyPrint("hello"); // class char: hello
  return 0;
}

使用重載函數(shù)時(shí),需要在函數(shù)調(diào)用中使用與對(duì)應(yīng)的重載函數(shù)匹配的函數(shù)參數(shù)類型。

而如下:

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

此時(shí)的printData調(diào)用和哪個(gè)原型匹配呢? 答案它不與任何函數(shù)原型匹配,而沒有匹配的原型不會(huì)停止調(diào)用其中某一個(gè)函數(shù),C++會(huì)嘗試用標(biāo)準(zhǔn)的強(qiáng)制類型轉(zhuǎn)換與之匹配,比如使用
printData(double data, int num),就可以將para的類型強(qiáng)制轉(zhuǎn)換為double類型。 但是還有printData(int data,int num)和printData(long data, char num)這兩個(gè)函數(shù)可以強(qiáng)制轉(zhuǎn)換para。 因此,C++將拒絕這種函數(shù)的調(diào)用,將這種調(diào)用視為錯(cuò)誤。

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

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

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

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

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

C++不允許這樣的方式重載函數(shù),雖然返回值可以不一樣,但是參數(shù)列表必須不一樣。
函數(shù)重載的使用原則:

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

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

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

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

常見問題:

1、C++中對(duì)函數(shù)重載是如何處理的?

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

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

編譯器在內(nèi)部可以轉(zhuǎn)換為:

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

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

由于在.cpp文件中,兩個(gè)函數(shù)生成的符號(hào)表中字符的名稱不一樣,所以是可以編譯通過的。

2、C語(yǔ)言中為什么不能支持函數(shù)重載?

編譯器在編譯.c文件時(shí),只會(huì)給函數(shù)進(jìn)行簡(jiǎn)單的重命名。 具體的方法是給函數(shù)名之前加上”_”; 所以編譯前兩個(gè)函數(shù)名相同的函數(shù)在編譯之后的函數(shù)名也照樣相同; 因此調(diào)用時(shí)會(huì)因?yàn)椴恢赖降渍{(diào)用哪個(gè)而出錯(cuò)。

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

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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7606

    瀏覽量

    137064
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62723
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2110

    瀏覽量

    73695
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1635

    瀏覽量

    49169
  • void
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    9878
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++重載運(yùn)算符和重載函數(shù)詳解

    在計(jì)算機(jī)程序設(shè)計(jì),運(yùn)算符重載(英語(yǔ):operator overloading)是多態(tài)的一種。這里,運(yùn)算符(比如+,=或==)被當(dāng)作多態(tài)函數(shù),它們的行為隨著其參數(shù)類型的不同而不同。運(yùn)算符并不一定總是符號(hào)。
    發(fā)表于 09-20 17:14 ?2004次閱讀

    關(guān)于C++函數(shù)重載機(jī)制

    重載機(jī)制是一種"假的"多態(tài).(因?yàn)樗窃诰幾g階段就進(jìn)行分配的機(jī)制).另外,C++還有一種"假的"多態(tài)機(jī)制就是模板機(jī)制,同樣只是改變函數(shù)參數(shù)的類型,并不會(huì)改變
    發(fā)表于 10-01 17:18

    函數(shù)重載隱藏覆蓋的區(qū)別

    ,兩個(gè)函數(shù)Add();在同一作用域,函數(shù)名相同都是Add,參數(shù)類型不同;就構(gòu)成了c++函數(shù)重載
    發(fā)表于 05-11 09:33

    嵌入式-C++函數(shù)重載

    一、什么是函數(shù)重載 兩個(gè)以上的函數(shù),具有相同的函數(shù)名,通過參數(shù)的類型和參數(shù)的個(gè)數(shù)不同。編譯器自行匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù) 二、
    發(fā)表于 06-28 13:54

    C++語(yǔ)言入門教程之C++語(yǔ)言程序設(shè)計(jì)函數(shù)的詳細(xì)資料概述免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++語(yǔ)言入門教程之C++語(yǔ)言程序設(shè)計(jì)函數(shù)的詳細(xì)資料概述免費(fèi)下載內(nèi)容包括了:1 函數(shù)的定義和使用2 函數(shù)的參數(shù)傳
    發(fā)表于 09-20 14:51 ?23次下載

    C++程序設(shè)計(jì)教程之運(yùn)算符重載的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之運(yùn)算符重載的詳細(xì)資料說明主要內(nèi)容包括了:1. 什么是運(yùn)算符重載,2. 運(yùn)算符重載的方法,3. 重載運(yùn)算
    發(fā)表于 03-14 16:04 ?4次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之運(yùn)算符<b class='flag-5'>重載</b>的詳細(xì)資料說明

    如何在中斷C函數(shù)調(diào)用C++

    之前,我們?cè)趩纹瑱C(jī)程序開發(fā)時(shí)都會(huì)面對(duì)中斷函數(shù)。眾所周知的,這個(gè)中斷函數(shù)肯定是要用C函數(shù)來定義的。我在用C++進(jìn)行程序開發(fā)的時(shí)候就發(fā)現(xiàn)了一個(gè)需
    發(fā)表于 05-09 18:17 ?0次下載
    如何在中斷<b class='flag-5'>C</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>中</b>調(diào)用<b class='flag-5'>C++</b>

    C++之操作符重載學(xué)習(xí)的總結(jié)

    操作符重載c++的強(qiáng)大特性之一;操作符重載的本質(zhì)是通過函數(shù)擴(kuò)展操作符的功能;operator 關(guān)鍵字是實(shí)現(xiàn)操作符重載的關(guān)鍵。
    的頭像 發(fā)表于 12-24 16:36 ?683次閱讀

    C++之類函數(shù)重載學(xué)習(xí)的總結(jié)

    類的成員函數(shù)之間可以進(jìn)行重載重載必須發(fā)生在同一個(gè)作用域中;全局函數(shù)和成員函數(shù)不能構(gòu)成重載關(guān)系;
    的頭像 發(fā)表于 12-24 17:02 ?521次閱讀

    C++重載函數(shù)學(xué)習(xí)總結(jié)

    函數(shù)重載c++對(duì)c的一個(gè)重要升級(jí);函數(shù)重載通過參數(shù)列表區(qū)分不同的同名
    的頭像 發(fā)表于 12-24 17:10 ?802次閱讀

    EE-128:C++的DSP:從C++調(diào)用匯編類成員函數(shù)

    EE-128:C++的DSP:從C++調(diào)用匯編類成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編類成員<b class='flag-5'>函數(shù)</b>

    深度解析C++的虛函數(shù)

    函數(shù)作為C++的重要特性,讓人又愛又怕,愛它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語(yǔ)法的偽裝,重新認(rèn)識(shí)一下虛函數(shù)。 虛函數(shù)
    的頭像 發(fā)表于 02-15 11:14 ?846次閱讀
    深度解析<b class='flag-5'>C++</b><b class='flag-5'>中</b>的虛<b class='flag-5'>函數(shù)</b>

    C++不一樣的重載是什么

    這里想分享C++中一個(gè)不一樣的重載,即const重載
    的頭像 發(fā)表于 02-21 14:02 ?775次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>不一樣的<b class='flag-5'>重載</b>是什么

    C++基礎(chǔ)知識(shí)之函數(shù)1

    函數(shù)C++ 的一個(gè)重要概念,它可以讓我們將一段代碼封裝起來,然后在需要的時(shí)候調(diào)用它。C++
    的頭像 發(fā)表于 04-03 10:34 ?584次閱讀

    同樣是函數(shù),在CC++中有什么區(qū)別

    ,即使沒有數(shù)據(jù)返回,也得寫 void。 第二個(gè)函數(shù)名。 C語(yǔ)言的函數(shù)名絕對(duì)不能重名,除了用上 weak 這樣的黑科技。同一個(gè)項(xiàng)目中,函數(shù)重名就會(huì)提示重復(fù)定義。
    的頭像 發(fā)表于 11-29 10:25 ?352次閱讀
    主站蜘蛛池模板: 天天综合天天看夜夜添狠狠玩| 亚洲天天做日日做天天看2018| 久久6免费视频| 在线免费观看一级毛片| 综合天堂| 日本不卡一区视频| 热re99久久精品国产99热| 国产高清在线播放免费观看| 中文字幕av一区二区三区| 国产精品午夜寂寞视频| 日日拍拍| 久久在草| 免费任我爽橹视频在线观看| 免费aa| 好黄好猛好爽好痛的视频| 成人国产亚洲欧美成人综合网| 手机看片福利盒子| 久久精品国产免费看久久精品| 天天爽夜夜爽精品免费| 欧美尺寸又黑又粗又长| 456影院第一| 欧美 亚洲 国产 精品有声| 伊人精品视频在线| 婷婷亚洲综合一区二区| 婷婷涩五月| 人人插人人插| 国产永久视频夜色资源网| 久操伊人网| 最刺激黄a大片免费观看| 奇米7777影视| toyota东热综合网| 亚洲小视频在线播放| 日本福利片午夜免费观着| 国产精品久久久久影院色老大| 国产女人和拘做受视频免费| 亚洲成片在线观看12345ba| 天天干天天爽天天射| 国产成人综合自拍| 男女视频在线看| 在线人成精品免费视频| 日本色片在线观看|