函數(shù)重載
什么是函數(shù)重載?
函數(shù)重載:
重載函數(shù)是函數(shù)的一種特殊情況。
為方便使用,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指1.參數(shù)的個(gè)數(shù) 2.類型 3.順序)必須至少有一個(gè)不同
根據(jù)這些同名函數(shù)的參數(shù)表的不同,達(dá)成傳入?yún)?shù)類型不同,調(diào)用的函數(shù)不同的效果
函數(shù)重載的作用
讓功能類似
的函數(shù)可以用同一名字,不用費(fèi)心思去取差別不大的名字
例
如果不用函數(shù)重載,就要給Swap,取Swap1,Swap2等名字容易混淆
使用函數(shù)重載的注意點(diǎn)
-
函數(shù)重載與函數(shù)的返回值
無關(guān)
-
同名
且參數(shù)表不同
【參數(shù)表不同即參數(shù)類型不同或參數(shù)個(gè)數(shù)不同或參數(shù)順序不同(滿足三個(gè)條件中的一個(gè)就行
)】的函數(shù)就可以構(gòu)成重載
參數(shù)類型不同:
參數(shù)個(gè)數(shù)不同:
參數(shù)順序不同:
-
只有
同一作用域
中的同名
且參數(shù)表不同
函數(shù)才構(gòu)成重載
即不同命名空間/類
中的同名函數(shù)不可能
構(gòu)成重載 -
重載函數(shù)也
可以參數(shù)缺省
例
這個(gè)時(shí)候就要注意:不要因?yàn)?code>少傳參數(shù)而導(dǎo)致調(diào)用的重載函數(shù)不明確
例
為什么C++可以函數(shù)重載,C語(yǔ)言不行?
這就又涉及到編譯鏈接
了,因?yàn)镃++是在C語(yǔ)言的基礎(chǔ)上出現(xiàn)的,而且C++是兼容C語(yǔ)言的【即C語(yǔ)言的語(yǔ)法在C++編譯器中也能使用】所以C++的編譯鏈接過程和C語(yǔ)言很像
(不了解編譯和鏈接的可以看我這篇文章:c語(yǔ)言編譯和鏈接)
為什么C++可以函數(shù)重載,C語(yǔ)言不行?這一問題主要是在編譯鏈接時(shí)的編譯
和匯編
時(shí)的符號(hào)匯總
和形成符號(hào)表
【符號(hào)表:可以簡(jiǎn)單的將其視為 詞法分析
時(shí)拆分出來的所有特殊符號(hào)
+該特殊符號(hào)對(duì)應(yīng)的地址
共同制作出的一份方便鏈接
的表】的時(shí)候
C語(yǔ)言編譯鏈接時(shí)函數(shù)名進(jìn)入符號(hào)表時(shí)表中對(duì)應(yīng)的特殊字符就是它的函數(shù)名
【不做任何修飾】
而C++的函數(shù)進(jìn)入符號(hào)表時(shí)表中對(duì)應(yīng)的特殊字符是編譯器根據(jù)該函數(shù)的參數(shù)表
和編譯器自己的修飾規(guī)則
【每個(gè)編譯器的修飾規(guī)則不同】對(duì)該函數(shù)名進(jìn)行修飾之后的特殊符號(hào),而不是單純的函數(shù)名
上面的差異就在編譯鏈接的鏈接部分起了不同的作用
因?yàn)殒溄邮歉鶕?jù)符號(hào)表中的特殊符號(hào)的名字找它的地址,并以此看它有沒有定義
而C語(yǔ)言如果函數(shù)名同名了,那進(jìn)入符號(hào)表的都是它的函數(shù)名根本區(qū)分不開,就算兩個(gè)函數(shù)都有定義有地址,鏈接時(shí)編譯器根本不知道找那個(gè)。
但C++不同它進(jìn)入符號(hào)的是編譯器根據(jù)該函數(shù)的參數(shù)表
和編譯器自己的修飾規(guī)則
修飾之后的符號(hào),如果它的參數(shù)不同修飾后的符號(hào)就不同,鏈接時(shí)編譯器“一眼“就看出不同了
引用
什么是引用?
引用是給已存在變量取一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。
即使用一個(gè)變量的引用就是使用該變量,修改它的引用
也是修改變量自己
例
引用的語(yǔ)法
源變量的類型+&+別名=源變量名
例
引用的特點(diǎn)
-
引用
必須初始化
-
一個(gè)變量可以有多個(gè)引用
例 -
引用一旦引用一個(gè)實(shí)體后就
不能
去引用其他實(shí)體了
例
如果直接=,就是賦值
引用的使用場(chǎng)景
引用可以做參數(shù),可以達(dá)到類似指針的效果
例
這樣設(shè)計(jì)Swap的參數(shù)的話,形參a,b就是實(shí)參a,c的引用,那么該a,b就是改a,c,改形參就是改實(shí)參
引用的底層實(shí)現(xiàn)
引用的底層【匯編層次
】實(shí)現(xiàn)其實(shí)是和指針一樣的
都是開出一個(gè)指針大小的空間將引用(指向)的變量的地址放進(jìn)去
但是使用上卻不同,為什么呢?
其實(shí)是編譯器進(jìn)行了隱式的包裝,我們使用引用時(shí)使用到的就是那一層包裝
所以一般認(rèn)為:
引用語(yǔ)法上
是不開空間的,引用和它引用的源變量共用一個(gè)空間
指針語(yǔ)法上
是開空間的,將指向的對(duì)象的地址存入開出的空間
傳參時(shí)傳引用和傳值的效率
傳引用效率更高,因?yàn)橐玫讓訉?shí)現(xiàn)是和指針一樣的,開空間存地址
所以傳參時(shí),如果形參是引用,那么實(shí)參傳遞的其實(shí)是實(shí)參的地址
引用和指針的區(qū)別
-
引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址。
-
引用在定義時(shí)必須初始化,指針沒有要求
-
引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體
-
有多級(jí)指針,但是沒有多級(jí)引用
-
沒有NULL引用,但有NULL指針
-
引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小文章來源:http://www.zghlxwxcb.cn/news/detail-844537.html
-
訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理文章來源地址http://www.zghlxwxcb.cn/news/detail-844537.html
到了這里,關(guān)于函數(shù)重載和引用【C++】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!