日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 函數(shù)重載

函數(shù)重載

來源:程序員人生   發(fā)布時(shí)間:2016-07-21 09:01:31 閱讀次數(shù):3001次

這篇文章,我將談?wù)勎易约簩瘮?shù)重載的簡單認(rèn)識。


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

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

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

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

首先我先解釋名字空間這個(gè)概念。還是實(shí)例吧。

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

這里std就是1個(gè)命名空間,標(biāo)準(zhǔn)輸入輸出流對象cin,cout都包括在std這個(gè)名字空間

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

看下邊的實(shí)例。

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


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

下邊進(jìn)入正題。

在.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中編譯不通過,緣由是兩個(gè)函數(shù)重名,在前邊的1篇文章《代碼

背后的故事》中提到程序從編譯到運(yùn)行出結(jié)果的進(jìn)程中的幾個(gè)階段。其中有1個(gè)階段提

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

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

其實(shí)吧,上邊兩個(gè)函數(shù)在c中根本編譯不通過(報(bào)錯(cuò):Add函數(shù)已有主體)就沒法生成符

號表。所以,我們?nèi)サ?個(gè)函數(shù),讓程序編譯通過,看看函數(shù)名在符號表中的命名。


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

1個(gè)程序中出現(xiàn)了同名函數(shù),他們在符號表中的命名1樣,這樣調(diào)用時(shí)就出現(xiàn)了沖突。

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



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

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

表示返回值類型,兩個(gè)參數(shù)類型。“@Z”表示名稱結(jié)束。

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

思考:如果在cpp文件里調(diào)用c文件里的函數(shù),這樣可以不???

//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; }


其實(shí),這段程序編譯通過,連接不通過,報(bào)錯(cuò)是沒法解析的外部符號。由于在c文件中的

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

里的函數(shù),其實(shí)不能成功。

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

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

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


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

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

yum  install gcc gcc-c++

安裝好了以后就能夠了。

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

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

發(fā)現(xiàn),整形數(shù)相加的函數(shù)生成的符號就是 _Z3Addii。_Z表示符號表名稱開始。‘3’表示函

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

下。

到這里,文章1開始的幾個(gè)問題都應(yīng)當(dāng)明白了。在c++里才有函數(shù)重載,c里并沒有,但

是c可使用回調(diào)函數(shù)來實(shí)現(xiàn)功能相近的函數(shù)。

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

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品一区二区久久久久久久网站 | 久久伊人国产视频 | 午夜精品久久久久久99热软件 | 天天操天天射天天添 | 青青久久网 | 日日夜夜影院 | 一区二区三区 在线 | 久久久一 | 久www| 国产一区二区三区手机在线 | 不卡一二三区 | 91久久久久久久久久久久久 | 欧美变态网站 | 国产精品视频免费在线观看 | 精品国产乱码久久久久久闺蜜 | 国产成人精品一区二区在线 | 懂色av午夜一区二区三区蜜桃 | 爱综合| 久久女人| 久久久久久麻豆 | aaa成人 | 欧美午夜一区二区三区免费大片 | 免费国产网站 | 17婷婷久久www| 99久久久久| 久久91精品国产91久久跳 | 亚洲国产一区二区三区 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲综合色站 | 日韩综合久久 | 久久国产精品一区二区三区 | 欧美日本韩国一区二区三区 | 综合国产| 91欧美精品成人综合在线观看 | 中国一级特黄真人毛片免费观看 | 91精品久久久久久 | 特黄av| 久久精品亚洲国产 | 久久久www成人免费无遮挡大片 | 欧美三区四区 | 欧美日韩a v |