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

淺析C++中的函數重載

 更新時間:2023年08月08日 11:02:58   作者:悲傷的魚香肉絲er  
這篇文章主要介紹了淺析C++中的函數重載,在C++中,可以為兩個或兩個以上的函數提供相同的函數名稱,只要參數類型不同,或者參數類型相同而參數個數不同,又或者參數類型參數個數相同,參數次序不同,稱為函數重載,需要的朋友可以參考下

一、什么是函數重載?

函數重載簡介:在C++中,可以為兩個或兩個以上的函數提供相同的函數名稱,只要參數類型不同,或者參數類型相同而參數個數不同,又或者參數類型參數個數相同,參數次序不同,稱為函數重載。

舉例:

int my_max(int a,int b)
{
	return a>b?a:b;
}
char my_max(char a, char b)
{
	return a>b?a:b;
}
double my_max(double a,double b)
{
	return a>b?a:b;
}
int main()
{
	cout<<my_max(12,23)<<endl;
	cout<<my_max(12.23,23.34)<<endl;
	cout<<my_max('a','b')<<endl;
	return 0;
}

二、函數重載的規(guī)則

1.編譯器的工作

 當一個函數名在同一個域中被聲明多次,兩個函數的參數表中參數個數或者類型順序不同,則認為是函數重載。

  注意:調用者與函數之間的關系在編譯時就被綁定在一起,其地址關聯(lián)。

2.函數重載的原理

編譯器如何知道與哪個函數關聯(lián)?為什么C語言不能進行函數重載,而C++可以?

編譯器是如何知道調用者與哪個函數關聯(lián)的呢?——通過名字粉碎(名字修飾)技術 。

“C”和“C++”函數是在編譯鏈接時通過修飾名來識別,而修飾名就是編譯器在編譯函數定義或聲明時生成的字符串,修飾名由函數名、類名、調用約定、返回類型、參數等共同決定的。

那調用約定有哪些呢?

_stdcall 回調 :是Pascal缺省的調用方式,通常用于Win32 Api中,函數采用從右到左的壓棧方式,自己在退出時清空堆棧。

C調用約定(_cdecl):按從右到左的順序壓參數入棧,由調用者把參數彈出,對于傳送參數的內存棧是由調用者來維護的,因此實現可變參數的函數只能使用該調用約定。

_fastcall快速調用:通過寄存器傳遞參數(實際上,它是用ECX和EDX傳送前兩個雙字或更小的參數,剩下參數仍然自右至左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧),它的主要特點就是速度快

thiscall:僅僅應用于C++類中的成員函數,this指針存放于ECX寄存器,參數自右向左壓

C語言為什么不能實現函數重載?

C語言編譯函數名修飾約定規(guī)則:C語言修飾函數名非常簡單,_cdecl是C/C++的缺省調用方式,調用約定前面添加下劃線前綴即可,例:_functionname

例:

C語言編譯時無法通過修飾名區(qū)分調用者與函數之間的關系

而在C++中函數名修飾約定規(guī)則是:

(1)以“?”標識函數名開始,后跟函數名

(2)函數名后面以“@@YA”標識參數表的開始,后跟參數表

(3)參數表以代號表示

(4)參數表的第一項為該函數的返回值類型,其后依次為參數的數據類型,指針標識在其所指數據類型前

(5)參數表后以@Z標識整個名字的結束,如果該函數無參數,則以“Z”標識結束。

常用代號如下:

X -- void

D -- char

E -- unsigned char

F -- short

H -- int

I -- unsigned int

J -- long

K -- unsigned long

M -- float

N -- double

_N -- bool

PA -- 表示指針,后面的代號表明指針類型

例:

編譯鏈接時,把參數類型,函數返回類型作為命名的一部分,編譯器編譯時可以區(qū)分調用哪個函數。

3.判斷函數重載的依據

可以確認為函數重載:

(1)函數名相同,參數類型不同

(2)參數類型相同,參數個數不同

(3)參數類型相同,參數個數相同,參數次序不同

不能作為判斷函數重載的依據的:

(1)參數表相同,返回類型不同

例:

當調用函數時,有時候不需要返回值,編譯器不知道調去用哪個函數,所以返回類型不能作為判斷重載的依據。

到此這篇關于淺析C++中的函數重載的文章就介紹到這了,更多相關C++函數重載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中的異或運算符^的使用方法

    C++中的異或運算符^的使用方法

    本篇文章對C++中的異或運算符^的使用方法進行的詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 純C++代碼詳解二叉樹相關操作

    純C++代碼詳解二叉樹相關操作

    二叉樹(Binary?tree)是樹形結構的一個重要類型。許多實際問題抽象出來的數據結構往往是二叉樹形式。本文將通過代碼為大家詳細講講C++二叉樹的一些常規(guī)操作,感興趣的可以學習一下
    2022-07-07
  • C語言實現井字棋游戲

    C語言實現井字棋游戲

    這篇文章主要為大家詳細介紹了C語言實現井字棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++從一個文件夾中讀出所有txt文件的方法示例

    C++從一個文件夾中讀出所有txt文件的方法示例

    這篇文章主要給大家介紹了關于C++從一個文件夾中讀出所有txt文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • C++11獲取線程返回值的實現代碼

    C++11獲取線程返回值的實現代碼

    這篇文章主要介紹了C++11獲取線程返回值的實現代碼,需要的朋友可以參考下
    2019-04-04
  • 關于C++繼承你可能會忽視的點

    關于C++繼承你可能會忽視的點

    繼承是面向對象三大特性之一,有些類與類之間存在特殊的關系,下面這篇文章主要給大家介紹了關于C++繼承你可能會忽視的點,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • C++中l(wèi)ist的用法實例講解

    C++中l(wèi)ist的用法實例講解

    list是順序容器的一種,list是一個雙向鏈表,使用list需要包含頭文件list,這篇文章主要給大家介紹了關于C++中l(wèi)ist的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • 詳解如何用c++實現平衡二叉樹

    詳解如何用c++實現平衡二叉樹

    平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別于AVL算法),由前蘇聯(lián)的數學家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉樹,根據科學家的英文名也稱為AVL樹。本文介紹了它的原理和如何用C++代碼來實現
    2021-06-06
  • C++ 二維數組傳參的四種方式

    C++ 二維數組傳參的四種方式

    C++的二維數組里面,通過用數組名傳參,傳過去后數組名會退化成一個一維數組指針,所以C++的函數參數不能像C語言一樣去寫,本文主要介紹了C++ 二維數組傳參的四種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • C語言實現密碼強度檢測

    C語言實現密碼強度檢測

    這篇文章主要為大家詳細介紹了C語言實現密碼強度檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

大港区| 深圳市| 武乡县| 手机| 南川市| 伊吾县| 湘乡市| 邵东县| 云阳县| 兴和县| 政和县| 瑞昌市| 南安市| 平顶山市| 凤凰县| 同心县| 乌拉特后旗| 四会市| 临安市| 盐源县| 苏尼特右旗| 襄垣县| 边坝县| 四平市| 长乐市| 汤原县| 淅川县| 新民市| 德江县| 蓬莱市| 秭归县| 永丰县| 金堂县| 民丰县| 武乡县| 施秉县| 黑山县| 繁峙县| 邵东县| 安溪县| 安平县|