這篇文章,我將談?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í)例吧。
這里std就是1個(gè)命名空間,標(biāo)準(zhǔn)輸入輸出流對象cin,cout都包括在std這個(gè)名字空間
里,而std又包括在iostream這個(gè)頭文件中。固然了。我們也能夠自定義名字空間。
看下邊的實(shí)例。
下邊進(jìn)入正題。
在.c文件中,寫出下邊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ù),這樣可以不???
其實(shí),這段程序編譯通過,連接不通過,報(bào)錯(cuò)是沒法解析的外部符號。由于在c文件中的
符號名是_Add,而在cpp文件中生成的其實(shí)不是(看上圖)。所以在cpp文件里調(diào)用c文件
里的函數(shù),其實(shí)不能成功。
處理這類問題的解決辦法是:
將cpp文件里的聲明語句改成:
這就是告知編譯器聲明的函數(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