亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++函數重載與重載原理:命名傾軋

2019-11-06 06:10:09
字體:
來源:轉載
供稿:網友

一、重載概念與原則:

1、重載概念:

在C原因中,一個函數不能與另一個函數重名,而在C++中,只要一個函數的參數列表與另一個函數的參數列表不完全相同,函數名就可以相同。而C++這一特點就是函數的重載。

同一個名字因為參數列表不同,展現了不同的結果,也叫靜多態。

2、重載原則:

①函數名相同,函數參數列表不同(類型、個數、順序) ②匹配原則1:嚴格匹配,找到再調用 ③匹配原則2:通過隱式類型轉換尋求一個匹配,找到則調用 ④返回值類型不構成重載條件

/*要是放在C語言中,這段代碼必然是編譯不通過,而在C++中是合乎重載原則的*/#include <iostream>using namespace std;float abs(float i){ return (i >= 0 ? i : -i);}double abs(double i){ return (i >= 0 ? i : -i);}int abs(int i){ return (i >= 0 ? i : -i);}int main(){ /*abbiguous二義性*/ float i = abs(-5.5f);/*默認調用第一個abs*/ float j = abs(-4.4);/*默認調用第二個,如果注銷掉第二個abs,編譯時出錯報二義性錯誤*/ cout << i << endl; cout << j << endl; /*浮點數默認大小(類型)*/ cout << "sizeof(4.5)=" << sizeof(4.5) << endl;/*default*/ cout << "sizeof(4.5f)=" << sizeof(4.5f) << endl; return 0;}

注意: 重載時的二義性:如果計算機存在有兩種隱式轉換選擇,計算機不會去選,而報二義性錯誤 eg1:double可以隱式轉換為float或int,如果abs(-4.4)并且定義float與int分別作為參數的ads(),編譯時則會產生二義性 eg2:double->int/float會產生兩義性,int->long/double也會產生兩義性。 即兩個特例重載時需要注意。 為了避免重載中的二義性問題,使用時按所需強制轉換,不要讓計算機去自己選擇

二、重載原理:命名傾軋(name mangling)

1、重載原理:name mangling(命名傾軋):

對于下面這段程序來說:

#include <iostream>using namespace std;//不設置,C++編譯器默認傾軋void func(int a){cout<<"a = "<<a<<endl;}void func(char a){cout<<"a = "<<a<<endl;}void func(int a, char b){cout<<"a = "<<a<<endl<<"b = "<<b<<endl;}void func(char a, int b){cout<<"a = "<<a<<endl<<"b = "<<b<<endl;}int main(void){ int a = 10; char b = 'b'; func(a); func(b); func(a,b); func(b,a); return 0;}

上面的程序在經過C++編譯器編譯時就類似于變成了下面這種寫法,這種寫法與其重載函數名以及參數類型有關:

#include <iostream>using namespace std;/*定義自動傾軋*/void func_i(int a){cout<<"a = "<<a<<endl;}void func_c(char a){cout<<"a = "<<a<<endl;}void func_ic(int a, char b){cout<<"a = "<<a<<endl<<"b = "<<b<<endl;}void func_ci(char a, int b){cout<<"a = "<<a<<endl<<"b = "<<b<<endl;}int main(void){ int a = 10; char b = 'b'; /*調用也自動傾軋*/ func_i(a); func_c(b); func_ic(a,b); func_ci(b,a); return 0;}

2、C++在兼容C時的不傾軋操作:

在C++中,定義階段與聲明操作階段均會進行傾軋(編譯時傾軋),使用extern “C”,可以將某函數設置為不傾軋,可C++需要傾軋以支持重載,為什么弄一個不傾軋出來呢?

分析: 首先,函數聲明時與定義時要么都傾軋,要么都不傾軋,必須得一一對應,否則會報函數找不到的錯誤。傾軋是編譯時進行的,而對于C++要兼容C的問題,C++就必須兼容C的語法與C庫(鏈接庫),C庫只在連鏈接時加入,不存在讓C++編譯器去傾軋的問題;而C頭文件中聲明的C庫函數在調用時會傾軋,要想使用不參加傾軋的C庫函數,C++中編譯時就不能傾軋C的頭文件中對于庫函數的聲明,即C庫中已經不能修改不傾軋為傾軋,則必須將頭文件中的聲明也設置為不傾軋,以此與庫中相互對應。如果查看C的標準頭文件,可以發現其中有一個extern “C”,表示不傾軋C的函數聲明。如下是string.h頭文件中的一部分:

/*查看string.h,發現在函數聲明之前,就對C++編譯器的編譯方式進行聲明extern "C",即聲明為:C++編譯器在編譯時不傾軋*/#ifndef _INC_STRING#define _INC_STRING#ifdef __cplusplus //如果是C++編譯器就要進行不傾軋設置extern "C" {#endif... //函數聲明等#ifdef __cplusplus//與上面匹配}#endif...

分別查看不同集成承環境中的string.h文件,都是有對函數的extern “C”不傾軋限定:

這里寫圖片描述

舉例說明:

#include <iostream>#include <string.h>using namespace std;extern "C"{ void func(int a){cout<<"a = "<<a<<endl;}}int main(void){ int a = 10; func(a); return 0;}

由于定義時不傾軋,而調用時傾軋,經過C++編譯器,其代碼成為:

#include <iostream>using namespace std;/*定義時設置成不傾軋,在編譯時,其函數名依舊相同*/void func(int a){cout<<"a = "<<a<<endl;}int main(void){ int a = 10; /*經C++編譯器,函數名變為傾軋后的函數名*/ func_i(a); return 0;}

這樣的代碼是不能夠完成編譯的。而要上面的函數能夠正常調用,要么定義與調用時均遵循默認的傾軋,要么均設置為不傾軋,做法如下:

/*main.cpp*/#include<iostream>#include"func.h"using namespace std;int main(void){ int a = 10; func(a); return 0;}/*func.c*/#include<iostream>using namespace std;extern "C"{ void func(int a){cout<<"a = "<<a<<endl;}}/*func.h*/#ifndef FUNC_H_#define FUNC_H_extern "C" void func(int);//聲明為不傾軋,調用根據聲明調用,自然不傾軋#endif

將函數聲明與函數定義時,都設置為不傾軋即可。當然均不設置,采用默認也是可以編譯通過的。但是聲明與定義兩部分只要任意一個設置為傾軋,另一個設置為不傾軋,編譯就不能通過。

測試結果如下:

聲明中不加extern “C”,編譯出錯: 這里寫圖片描述 聲明中加extern “C”,編譯不出錯: 這里寫圖片描述

總之一句話,傾軋是C++為了實現函數重載而設計的,不傾軋的extern “C”則是為了兼容C而后實現的。我們編程一般犯不著對自定義的C++函數設置。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲国产成人| 日韩免费观看在线观看| 日本精品视频在线播放| 欧美激情久久久久久| 欧美电影免费观看网站| 欧美片一区二区三区| 日韩激情视频在线| 欧美激情久久久| 亚洲sss综合天堂久久| 欧美日韩另类视频| 美日韩精品视频免费看| 亚洲美女精品成人在线视频| 亚洲成人黄色网址| 欧美日韩一区二区在线| 久久av中文字幕| 国产日韩欧美在线看| 伊人久久大香线蕉av一区二区| 国产一区二区日韩精品欧美精品| 国产成人亚洲综合| 国产成人一区二区三区| 久久久精品美女| 亚洲欧美日韩精品久久奇米色影视| 久久91精品国产91久久久| 久久视频精品在线| 黄色一区二区在线观看| 久久精品99久久久久久久久| 日韩一区二区三区国产| 国产精品久久久精品| 中文字幕亚洲无线码在线一区| 色午夜这里只有精品| 久久久久久久久久国产精品| 国产一区二区久久精品| 亚洲国语精品自产拍在线观看| 色哟哟网站入口亚洲精品| 日本成人黄色片| 国产激情视频一区| 久久综合国产精品台湾中文娱乐网| 日韩免费精品视频| 亚洲精品国偷自产在线99热| 日韩精品免费电影| 菠萝蜜影院一区二区免费| 日韩中文字幕视频在线观看| 欧美专区在线观看| 欧美国产激情18| 成人精品久久av网站| www.日韩不卡电影av| 久久99精品国产99久久6尤物| 日韩在线中文字| 久久久久久久久久久亚洲| www.久久色.com| 在线观看成人黄色| 一本一本久久a久久精品综合小说| 久久久亚洲精选| 亚洲国产成人久久综合一区| www亚洲精品| 国产精品成人免费电影| 免费97视频在线精品国自产拍| 亚洲另类激情图| 91久久久久久久久| 国产成人综合亚洲| 亚洲国产精品va在线观看黑人| 欧美一级片在线播放| 国产xxx69麻豆国语对白| 久久亚洲精品视频| 国产精品视频永久免费播放| 丝袜美腿亚洲一区二区| 欧美日韩激情小视频| 国产精品久久久91| 国产欧美一区二区| 91系列在线观看| 少妇激情综合网| 在线亚洲国产精品网| 成人黄色影片在线| 91香蕉亚洲精品| 国产精品扒开腿做| 国产精品美女网站| 欧美亚洲国产视频| 黑人与娇小精品av专区| 69国产精品成人在线播放| 欧美高清videos高潮hd| 国产精品综合久久久| 91精品啪aⅴ在线观看国产| 午夜剧场成人观在线视频免费观看| 国产成人精品亚洲精品| 精品视频偷偷看在线观看| 91av在线免费观看| 狠狠躁18三区二区一区| 清纯唯美日韩制服另类| 欧美午夜女人视频在线| 欧美激情乱人伦一区| 97精品国产91久久久久久| 日韩欧美成人网| 国产精品成久久久久三级| 亚洲视频axxx| 91精品国产777在线观看| 久久精品电影网站| 国内自拍欧美激情| 亚洲男人天堂古典| 疯狂做受xxxx欧美肥白少妇| 国产欧美日韩丝袜精品一区| 日韩男女性生活视频| 欧美日韩另类字幕中文| 欧美成人久久久| 一区国产精品视频| 国产视频精品va久久久久久| 91精品在线一区| 欧美高跟鞋交xxxxhd| 2020欧美日韩在线视频| 亚洲成人三级在线| 久久亚洲春色中文字幕| 这里只有精品在线观看| 日韩中文字幕国产精品| 在线观看日韩www视频免费| 欧美亚洲日本网站| 色999日韩欧美国产| 国产一区二区激情| 精品国产一区二区三区久久狼黑人| 亚洲精品av在线播放| 免费av在线一区| 国产亚洲美女精品久久久| 亚洲午夜未满十八勿入免费观看全集| 国产精品va在线播放我和闺蜜| 国产亚洲福利一区| 亚洲精品欧美一区二区三区| 26uuu亚洲伊人春色| 国产精品日韩在线| 日韩av最新在线观看| 亚洲日本中文字幕| 日韩黄在线观看| 国产一区私人高清影院| 精品久久久久久亚洲国产300| 亚洲精品日韩av| 欧美日韩另类字幕中文| 久久综合国产精品台湾中文娱乐网| 高清欧美性猛交xxxx| 亚洲精品美女久久| 成人精品aaaa网站| 欧美性猛交xxxx乱大交3| 久久久爽爽爽美女图片| 久久精品一偷一偷国产| 久久免费国产精品1| 91成人在线播放| 国产日韩欧美综合| 日韩免费高清在线观看| 最好看的2019的中文字幕视频| 91精品国产一区| 欧美黑人又粗大| 国产精品久久久久久久久久小说| 亚洲精品午夜精品| 亚洲精品xxxx| 久久久精品影院| 亚洲一区二区三区四区在线播放| 国产精品吊钟奶在线| 成人午夜激情免费视频| 97精品视频在线观看| 上原亚衣av一区二区三区| 国产精品99导航| 中文字幕精品一区久久久久| 欧美精品精品精品精品免费| 日韩视频亚洲视频| 这里只有精品视频| 日韩精品视频中文在线观看| 欧美精品免费播放| 一本色道久久综合狠狠躁篇怎么玩|