多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 函數重載

函數重載

來源:程序員人生   發布時間:2016-07-21 09:01:31 閱讀次數:2998次

這篇文章,我將談談我自己對函數重載的簡單認識。


1開始,我們得明白,函數重載是甚么??為何要函數重載??函數重載可以做哪些

事??函數重載是指在同1作用域內,可以有1組具有相同函數名,不同參數列表的函

數,這組函數被稱為重載函數。重載函數通經常使用來命名1組功能相似的函數,這樣做減

了函數名的數量,避免了名字空間的污染,對程序的可讀性有很大的好處。

首先我先解釋名字空間這個概念。還是實例吧。

#include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; }

這里std就是1個命名空間,標準輸入輸出流對象cin,cout都包括在std這個名字空間

里,而std又包括在iostream這個頭文件中。固然了。我們也能夠自定義名字空間。

看下邊的實例。

#include<iostream> namespace A { int a = 10; int b = 20; } namespace A //表示在A命名空間里增加內容 { int c = 0; } int main() { std::cout<<a<<std::endl; std::cout<<c<<std::endl; return 0; }


固然了,我們也能夠在std命名空間里添加內容,但是1般不那末做。

下邊進入正題。

在.c文件中,寫出下邊1段的代碼:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int Add(int x, int y) { return x + y; } float Add(float x, float y) { return x + y; } int main() { Add(10,20); Add(10.0f,20.0f); system("pause"); return 0; }


上邊這段代碼在vs2015中編譯不通過,緣由是兩個函數重名,在前邊的1篇文章《代碼

背后的故事》中提到程序從編譯到運行出結果的進程中的幾個階段。其中有1個階段提

到生成符號表。我們來看1下上邊的函數成的符號表。符號表是在.map文件里,在vs里默許不顯示符號表文件。要想顯示出來,這樣設置:

工程名右擊--->屬性---->鏈接器----->調試---->生成映照文件選擇是。

其實吧,上邊兩個函數在c中根本編譯不通過(報錯:Add函數已有主體)就沒法生成符

號表。所以,我們去掉1個函數,讓程序編譯通過,看看函數名在符號表中的命名。


通過這個我們可以得出,函數在符號表中的命名就是函數名前邊加個下劃線。所以如果

1個程序中出現了同名函數,他們在符號表中的命名1樣,這樣調用時就出現了沖突。

要是上邊的1段程序在cpp文件中運行,來看看情況。



這里我們可以看出,雖然兩個函數的函數名1樣,但是他們在符號表中生成的名稱不1

樣。‘?’表示名稱開始,‘?’后邊是函數名“@@YA”表示參數表開始,后邊的3個字符分別

表示返回值類型,兩個參數類型。“@Z”表示名稱結束。

由于兩個函數生成的符號表中的名稱不1樣,所以是可以編譯通過的。

思考:如果在cpp文件里調用c文件里的函數,這樣可以不???

//cpp文件 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> extern int Add(int x,int y); int main() { int ret = Add(10,20); getchar(); return 0; } //c文件 int Add(int x, int y) { return x + y; }


其實,這段程序編譯通過,連接不通過,報錯是沒法解析的外部符號。由于在c文件中的

符號名是_Add,而在cpp文件中生成的其實不是(看上圖)。所以在cpp文件里調用c文件

里的函數,其實不能成功。

處理這類問題的解決辦法是:

將cpp文件里的聲明語句改成:

extern "C" int Add(int x,int y);


這就是告知編譯器聲明的函數是c提供的。下邊我們來看1下在linux虛擬機下生成的符

號表文件。cpp文件在linux虛擬機里需要用g++編譯。安裝g++很簡單。1句命令就好。

yum  install gcc gcc-c++

安裝好了以后就能夠了。

運行程序以后,使用命令:objdump a.out -t > test.out

-t是表示生成符號表,最后是將生成的符號表放在test.out文件。打開test.out文件,就會

發現,整形數相加的函數生成的符號就是 _Z3Addii。_Z表示符號表名稱開始。‘3’表示函

數名的字符個數。i是int的縮寫。是的,linux下生成符號表中的符號完全不同于wiindows

下。

到這里,文章1開始的幾個問題都應當明白了。在c++里才有函數重載,c里并沒有,但

是c可使用回調函數來實現功能相近的函數。

好了,關于函數重載就到這里。有問題私我~~郵箱:1521107105@qq.com

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美精品video | 亚洲高清在线 | 亚洲欧美久久 | 国产毛片久久国产 | 国产中文字幕在线观看 | 手机福利视频 | 最新的国产成人精品2022 | 老师邪恶影院a啦啦啦影院 老司机av | 国产精品国产三级国产在线观看 | 动漫精品欧美一区二区三区 | 国内精品久久国产大陆 | 韩国三级做爰中文字幕 | 亚洲日本视频 | 欧美一区二区三区精品影视 | 午夜爱爱片 | 欧美日韩国产精品自在自线 | 亚洲精品视频在线播放 | 亚洲毛片在线 | 国产6080一级毛片 | 在线精品自拍亚洲第一区 | 欧美日韩国产另类一区二区三区 | 成年人视频免费网站 | 国产精品福利一区 | 国产精品久久久久久免费播放 | xxnx日本免费护士 | 男女激情视频 | 国产精品嫩草免费视频 | 色性欧美 | 欧美综合网站 | 黑人gay巨大 | 欧美wwwxxxx| 日韩欧美一中文字幕不卡 | 欧美jizzhd精品欧美另类 | 亚洲精品一区二区三区婷婷月 | 亚洲精品国产专区一区 | 毛片在线播放观看日本 | 亚洲日韩天堂 | 新japanesevideo乱熟 | 毛片大全网站 | 亚洲成人91| 秋霞网亚洲成a人片 |