C++中函數(shù)重載詳解
函數(shù)重載的概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的 形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。
函數(shù)重載的應(yīng)用
1.比如以下代碼,函數(shù)名一樣,而參數(shù)的類型不同,在調(diào)用的時(shí)候編譯器會(huì)根據(jù)傳遞的參數(shù)自動(dòng)進(jìn)行匹配。
2.在例如以下代碼,我們進(jìn)行編譯,都可以編譯成功。
3.接下來(lái)看一個(gè)有趣的現(xiàn)象,將上述第二個(gè)例子中的第一個(gè)函數(shù)的最后一個(gè)參數(shù)改為缺省參數(shù),此時(shí)調(diào)用f(1,2),編譯器直接報(bào)錯(cuò)。其實(shí)這兩個(gè)函數(shù)在語(yǔ)法上是構(gòu)成重載的,但是當(dāng)調(diào)用時(shí),只給了兩個(gè)參數(shù),我們知道缺省參數(shù)可以不給,那么此時(shí)編譯器就不知道調(diào)用哪個(gè)函數(shù)了,就出現(xiàn)了“調(diào)用不明確”的錯(cuò)誤。
為什么C++支持函數(shù)重載,而C語(yǔ)言不支持
在 C/C++ 中,一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下幾個(gè)階段: 預(yù)處理、編譯、匯編、鏈接。 1. 實(shí)際我們的項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,而通過(guò)我們 C 語(yǔ)言階段學(xué)習(xí)的編譯鏈接,我們 可以知道,【當(dāng)前a.cpp 中調(diào)用了 b.cpp 中定義的 Add 函數(shù)時(shí)】,編譯后鏈接前, a.o 的目標(biāo)文件中沒(méi)有 Add的函數(shù)地址,因?yàn)?Add 是在 b.cpp 中定義的,所以 Add 的地址在 b.o 中。那么怎么辦呢? 2. 所以鏈接階段就是專門處理這種問(wèn)題, 鏈接器看到 a.o 調(diào)用 Add ,但是沒(méi)有 Add 的地址,就會(huì)到 b.o 的符 號(hào)表中找 Add 的地址,然后鏈接到一起。 3. 那么鏈接時(shí),面對(duì) Add 函數(shù),連接器會(huì)使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的函數(shù)名修飾規(guī) 則。 4. 由于 Windows 下 vs 的修飾規(guī)則過(guò)于復(fù)雜,而 Linux 下 gcc 的修飾規(guī)則簡(jiǎn)單易懂,下面我們使用了 gcc 演示了這個(gè)修飾后的名字。 5. 通過(guò)下面我們可以看出 gcc 的函數(shù)修飾后名字不變。而 g++ 的函數(shù)修飾后變成【 _Z+ 函數(shù)長(zhǎng)度 + 函數(shù)名 + 類 型首字母】。
一、在Linux環(huán)境下采用C語(yǔ)言編譯器編譯后:函數(shù)名字的修飾沒(méi)有發(fā)生改變。
二、采用C++編譯器編譯后:函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中。
通過(guò)這里就理解了 C 語(yǔ)言沒(méi)辦法支持重載,因?yàn)橥瘮?shù)沒(méi)辦法區(qū)分。而 C++ 是通過(guò)函數(shù)修飾規(guī)則來(lái)區(qū) 分,只要參數(shù)不同,修飾出來(lái)的名字就不一樣,就支持了重載。
到此這篇關(guān)于C++中函數(shù)重載詳解的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++ Thread實(shí)現(xiàn)簡(jiǎn)單的socket多線程通信
本文主要介紹了C++ Thread實(shí)現(xiàn)簡(jiǎn)單的socket多線程通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C語(yǔ)言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理軟件
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++中strlen函數(shù)的三種實(shí)現(xiàn)方法
在C語(yǔ)言中我們要獲取字符串的長(zhǎng)度,可以使用strlen?函數(shù),strlen?函數(shù)計(jì)算字符串的長(zhǎng)度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)閟trlen函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用strlen函數(shù)計(jì)算的字符串的長(zhǎng)度會(huì)比使用sizeof計(jì)算的字符串的字節(jié)數(shù)要小2022-05-05NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)
這篇文章主要介紹了NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)的相關(guān)資料,希望通過(guò)本文大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C/C++ 原生API實(shí)現(xiàn)線程池的方法
線程池,簡(jiǎn)單來(lái)說(shuō)就是有一堆已經(jīng)創(chuàng)建好的線程,接下來(lái)通過(guò)本文給大家介紹C/C++ 原生API實(shí)現(xiàn)線程池的方法,感興趣的朋友跟隨小編一起看看吧2021-11-11