<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在C++中可以為兩個或者兩個以上函數提供相同的函數名稱,只要引數型別不同,或者引數數目不同,引數順序不同,即參數列不同,那麼就認為是函數的過載。(函數名+參數列)
// my_max + 參數列 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() { int ix = my_max(12,23); double dx = my_max(12.23,34.45); char chx = my_max('a','b'); return 0; }
函數的左值:和資料型別無關,有名字並且可以取地址
函數的有值:字面常數,不能取地址的
右值參照: && ,可以參照字面常數,參照右值
int && r = 10; //可以參照字面常數
1.如果兩個函數的參數列相同, 但是返回型別不同,會被標記為編譯錯誤:函數的重複宣告。
int my_max(int a,int b) { return a > b ? a : b; } unsigned int my_max(int a,int b) // error; { return a > b ? a : b; } int main() { int ix = my_max(12,23); unsigned int = my_max(12,23); // error; reutrn 0; }
2.參數列的比較過程與形參名無關。
// 宣告同一個函數 int my_add(int a,int b); int my_add(int x,int y);
3.如果在兩個函數的參數列中,只有預設實參不同,則第二個宣告被視為第一個的重複宣告
void Print(int *br,int n); void Print(int *br,int len = 10);
4.typedef 名為現有的資料型別提供了一個替換名,它並沒有建立一個新型別 ,因此 ,如果兩個函數參數列的區別只在於一個使用了 typedef ,而另一個使用了與 typedef 相應的型別。則該參數列被視為相同的參數列。
typedef unsigned int u_int; int Print(u_int a) int Print(unsigned int b);
5.當一個形參型別有 const 或 volatile 修飾時,如果形參是按值傳遞方式定義,在識別函數宣告是否相同時,並不考慮 const 和 volatile 修飾符.
void fun(int a){ } void fun(const int a) { }
6.當一個形參型別有 const 或 volatile 修飾時,如果形參定義指標或參照時,在識別函數宣告是否相同時 ,就要考慮 const 和 volatile 修飾符.
void fun(int *p) {} void fun(const int *p) {} void fun(int &a) {} void fun(const int &a) {}
7.注意函數呼叫的二義性;
如果在兩個函數的參數列中,形參型別相同,而形參個數不同,形參預設值將會影響函數的過載
void fun(int a){} void fun(int a,int b){} void fun(int a ,int b = 10);
8.函數過載解析的步驟如下
“C”或者“C++”函數在內部(編譯和連結)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字串。
修飾名由函數名、類名、呼叫約定、返回型別、引數等共同決定。
呼叫約定:
C呼叫約定(即用 __cdecl 關鍵字說明)按從右至左的順序壓引數入棧,由呼叫者把引數彈出棧。
對於傳送引數的記憶體棧是由呼叫者來維護的(正因為如此,實現可變引數的函數只能使用該呼叫約
定)。
在C/C++中,一個程式要執行起來,需要經歷以下幾個階段:預編譯(預處理)、編譯、組合、鏈
接。Name Mangling是一種在編譯過程中,將函數名、變數名的名字重新命名的機制。
C 語言編譯時函數名修飾約定規則
C語言的名字修飾規則非常簡單,__cdecl是C/C++的預設呼叫方式, 呼叫約定函數名字前面新增了下
劃線字首。
格式:_functionname
C++編譯時函數名修飾約定規則:
__cdecl 呼叫約定:
1、以“?”標識函數名的開始,後跟函數名;
2、函數名後面以“@@YA”標識參數列的開始,後跟參數列;
3、參數列以代號表示:
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-- 表示指標,後面的代號表明指標型別,如果相同型別的指標連續出現,以“ 0 ”代替,一個“ 0 ”代表
一次重複;
4、參數列的第一項為該函數的返回值型別,其後依次為引數的資料型別,指標標識在其所指資料型別前;
5、參數列後以“@Z”標識整個名字的結束,如果該函數無引數,則以“ Z ”標識結束。
//(?my_add_int@@YGHHH@Z) int __stdcall my_add_int(int a, int b) { return a + b; } //(?print_int@@YAXH@Z) void __cdecl print_int(int a) { printf("%d ", a); } // (?fun@@YIXXZ) void __fastcall fun() { } int main() { my_add_int(12, 23); print_int(12); fun(); return 0; }
C++函數是過載
//(?my_max@@YAHHH@Z) int my_max(int a, int b); //(?my_max@@YADDD@Z) char my_max(char a, char b); //(?my_max@@YANNN@Z) double my_max(double a, double b); int main() { my_max(12, 23); my_max('a', 'b'); my_max(12.23, 34.45); return 0; }
到此這篇關於C++深入講解函數過載的文章就介紹到這了,更多相關C++函數過載內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45