精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++中函數重載的使用

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

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

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

#include 
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);

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

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

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

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

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

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

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

常見問題:

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

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

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,無法區分,

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136251
  • 函數
    +關注

    關注

    3

    文章

    4308

    瀏覽量

    62444
  • C++
    C++
    +關注

    關注

    22

    文章

    2104

    瀏覽量

    73503
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49057
  • void
    +關注

    關注

    0

    文章

    23

    瀏覽量

    9858
收藏 人收藏

    評論

    相關推薦

    C++重載運算符和重載函數詳解

    在計算機程序設計,運算符重載(英語:operator overloading)是多態的一種。這里,運算符(比如+,=或==)被當作多態函數,它們的行為隨著其參數類型的不同而不同。運算符并不一定總是符號。
    發表于 09-20 17:14 ?1823次閱讀

    關于C++函數重載機制

    重載機制是一種"假的"多態.(因為他是在編譯階段就進行分配的機制).另外,C++還有一種"假的"多態機制就是模板機制,同樣只是改變函數參數的類型,并不會改變
    發表于 10-01 17:18

    函數重載隱藏覆蓋的區別

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

    嵌入式-C++函數重載

    一、什么是函數重載 兩個以上的函數,具有相同的函數名,通過參數的類型和參數的個數不同。編譯器自行匹配,自動確定調用哪一個函數 二、
    發表于 06-28 13:54

    C++語言入門教程之C++語言程序設計函數的詳細資料概述免費下載

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

    C++程序設計教程之運算符重載的詳細資料說明

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

    如何在中斷C函數調用C++

    之前,我們在單片機程序開發時都會面對中斷函數。眾所周知的,這個中斷函數肯定是要用C函數來定義的。我在用C++進行程序開發的時候就發現了一個需
    發表于 05-09 18:17 ?0次下載
    如何在中斷<b class='flag-5'>C</b><b class='flag-5'>函數</b><b class='flag-5'>中</b>調用<b class='flag-5'>C++</b>

    C++之操作符重載學習的總結

    操作符重載c++的強大特性之一;操作符重載的本質是通過函數擴展操作符的功能;operator 關鍵字是實現操作符重載的關鍵。
    的頭像 發表于 12-24 16:36 ?647次閱讀

    C++之類函數重載學習的總結

    類的成員函數之間可以進行重載;重載必須發生在同一個作用域中;全局函數和成員函數不能構成重載關系;
    的頭像 發表于 12-24 17:02 ?492次閱讀

    C++重載函數學習總結

    函數重載c++c的一個重要升級;函數重載通過參數列表區分不同的同名
    的頭像 發表于 12-24 17:10 ?781次閱讀

    EE-128:C++的DSP:從C++調用匯編類成員函數

    EE-128:C++的DSP:從C++調用匯編類成員函數
    發表于 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>調用匯編類成員<b class='flag-5'>函數</b>

    適合具備 C 語言基礎的 C++ 入門教程(二)

    在上一則教程,通過與 C 語言相比較引出了 C++ 的相關特性,其中就包括函數重載,引用,this 指針,以及在脫離 IDE 編寫
    發表于 01-25 19:13 ?1次下載
    適合具備 <b class='flag-5'>C</b> 語言基礎的 <b class='flag-5'>C++</b> 入門教程(二)

    深度解析C++的虛函數

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

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

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

    C++基礎知識之函數1

    函數C++ 的一個重要概念,它可以讓我們將一段代碼封裝起來,然后在需要的時候調用它。C++
    的頭像 發表于 04-03 10:34 ?535次閱讀