函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的 形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。

int add(int a, int b, int c)
{
return a+b+c;
}
int add(int a, int b)
{
return a+b;
}
int main()
{
add(1,2,3);
add(1,2);
return 0;
}? 思考下面一段代碼,下面兩個(gè)函數(shù)是否屬于函數(shù)重載,他們有沒(méi)有什么問(wèn)題?
int func()
{
return 0;
}
int func(int a=10)
{
return a;
}
int main()
{
func();
func();
return 0;
}根據(jù)定義,函數(shù)名相同參數(shù)不同,他們當(dāng)然構(gòu)成重載函數(shù),雖然他們構(gòu)成重載函數(shù),但是在使用時(shí)會(huì)有問(wèn)題,因?yàn)檎{(diào)用函數(shù)時(shí)存在二異性。應(yīng)該避免這種情況出現(xiàn)。
? 函數(shù)重載原理? 先大概了解編譯器編譯程序過(guò)程(Linus下),現(xiàn)在有test. c、func.c、func.h三個(gè)文件。
1.預(yù)處理階段,func.h頭文件被展開(kāi)、然后進(jìn)行宏替換、條件編譯、去注釋。生成func.i和test.i兩個(gè)文件。
2.編譯階段,檢查語(yǔ)法,生成匯編代碼。生成func.s和test.s文件。
3.匯編,匯編代碼轉(zhuǎn)化為二進(jìn)制機(jī)器碼,形成符號(hào)表。生成func.o和test.o文件。
4.鏈接,文件在鏈接階段被分成幾段進(jìn)行操作。先進(jìn)行合并段表,把相關(guān)文件對(duì)應(yīng)的段連接到一起,然后對(duì)符號(hào)表進(jìn)行合并和重定向。生成func.o和test.o鏈接生成a.out文件。
? C語(yǔ)言不支持函數(shù)重載,因?yàn)榫幾g時(shí)兩個(gè)重載函數(shù)函數(shù)名相同,在func.o符號(hào)表中存在歧義和沖突,其次鏈接時(shí)也有沖突,因?yàn)镃語(yǔ)言中是直接使用函數(shù)名標(biāo)識(shí)和查找。? ? ? ? ??? ??
?
? 而C++的目標(biāo)文件符號(hào)表中不是直接使用函數(shù)名來(lái)標(biāo)識(shí)和查找函數(shù),它引入了函數(shù)名修改規(guī)則,通過(guò)參數(shù)的屬性修改函數(shù)名。前面提到C++中函數(shù)重載的概念中必須有參數(shù)個(gè)數(shù) 或 類型 或 順序的不同,通過(guò)這三種參數(shù)屬性修改了函數(shù)名,不同編譯器的修改規(guī)則不同。Linus下修飾規(guī)則為_(kāi)Z+函數(shù)長(zhǎng)度+函數(shù)名+參數(shù)類型首字母。? ? ? ?
??????
? 通過(guò)這里我們就明白了為什么C語(yǔ)言不支持函數(shù)重載,因?yàn)橥瘮?shù)無(wú)法區(qū)分,而C++使用函數(shù)修改規(guī)則通過(guò)參數(shù)的不同屬性改變了函數(shù)名,從而就能支持重載。
引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。類型&引用變量名(對(duì)象名)=引用實(shí)體。引用在語(yǔ)法層沒(méi)有開(kāi)辟新空間,相當(dāng)于給原變量起一個(gè)新名稱。下圖我們會(huì)發(fā)現(xiàn)a和b的地址一樣。
#includeusing namespace std;
int main()
{
int a = 10;
int& b = a;
system("pause");
return 0;
}
引用的特性? 1.引用在定義時(shí)必須初始化。
void test()
{
//int& b;//編譯會(huì)出錯(cuò)
}? 2.一個(gè)變量可以有多個(gè)引用。
void test()
{
int a=10;
int& b=a;
int& c=a;
int& d=b;
}? 3.引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體。
void test()
{
int a=10;
int& b=a;
int c=15;
b=c;//這里不是b引用c,而是把c的值賦給b,要和指針的使用區(qū)分
}引用的使用? 1.引用做參數(shù),功能與傳指針參數(shù)類似。
//傳指針
void swap(int* x,int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//傳引用
void swap(int& x,int& y)
{
int tmp=x;
x=y;
y=tmp;
}
int main()
{
int a=10;
int b=20;
swap(&a,&b);
swap(a,b);
return 0;
}2.引用做返回值?
在傳值返回的函數(shù)中,因?yàn)楹瘮?shù)執(zhí)行完成后函數(shù)棧幀已經(jīng)被銷毀,會(huì)非法訪問(wèn)返回的變量,所以返回的值需要先存儲(chǔ)在臨時(shí)變量中。如果返回的對(duì)象較小不大于八個(gè)字節(jié),一般是寄存器充當(dāng)臨時(shí)變量,如果比較大則存放在調(diào)用函數(shù)的棧幀內(nèi)。所有的傳值返回都會(huì)生成一個(gè)拷貝,當(dāng)返回的數(shù)據(jù)量很大時(shí)使用引用做返回值效率會(huì)提高。
傳值返回:
??
?
下面這段代碼存在非法訪問(wèn)的問(wèn)題,add函數(shù)的返回值是變量c的引用,當(dāng)函數(shù)執(zhí)行完成棧幀銷毀后,訪問(wèn)了c的空間,如果add函數(shù)棧幀銷毀時(shí)清理空間,那么取c值時(shí)取到的就是隨機(jī)值。
#includeusing namespace std;
int& add(int x, int y)
{
int c = x + y;
return c;
}
int main()
{
//非法訪問(wèn)c的空間
int ret = add(10, 20);
return 0;
} ? 上面的例子是一個(gè)錯(cuò)誤的用法,那么該如何使用引用返回?如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回的對(duì)象還在(靜態(tài)變量、全局變量等),則可以使用引用返回,否則必須使用傳值返回。
#includeusing namespace std;
int& add(int x, int y)
{
static int c = x + y;
return c;
}
int main()
{
int ret = add(10, 20);
return 0;
} ? 總結(jié)? 引用的作用主要體現(xiàn)在傳參和傳返回值
? 1.引用傳參和引用傳返回值在有些場(chǎng)景下可以提高性能(大對(duì)象+深拷貝對(duì)象)
? 2.引用傳參和引用傳返回值做輸出型參數(shù)和輸出型返回值。有些場(chǎng)景下形參的改變可以改變實(shí)參,引用返回可以改變返回對(duì)象。
? 常引用int main()
{
const int a=10;
int& b=a;//權(quán)限的放大,編譯會(huì)出錯(cuò),a只讀而b可寫
const int& b=a;//權(quán)限不變,可編譯通過(guò)
int c=10;
const int& d=c;//權(quán)限的縮小,編譯可以通過(guò)
return 0;
}你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:C語(yǔ)言到C++(基礎(chǔ)語(yǔ)法二)-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.chinadenli.net/article0/dgspoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航、微信小程序、響應(yīng)式網(wǎng)站、做網(wǎng)站、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容