- 👑專欄內(nèi)容:C++學(xué)習(xí)筆記
- ?個(gè)人主頁:子夜的星的主頁
- 💕座右銘:日拱一卒,功不唐捐
C語言
小朋友,最近談了個(gè)女朋友,但是他很苦惱。因?yàn)樗?jīng)常不能理解自己女朋友說話的意思。小C
第一次和女友約會(huì)時(shí),自己先到了對(duì)方卻還沒出門,電話詢問,女友表示“你給我等著!”,于是聽話的小C
就站在原地等待女友的到來。第二次約會(huì),自己沒到女友卻先到了,接到電話,女友表示“你給我等著!”于是小C
馬上向上次一樣站在原地等待,但是這次卻沒有等到女友的到來。
小C
對(duì)這一現(xiàn)象表示十分的不理解。明明是一句話,為什么女友執(zhí)行的卻是不同的操作?
對(duì)于這個(gè)問題,小C
找到了自己戀愛經(jīng)驗(yàn)豐富的舔狗大哥C++
,想從他那找到答案。
在自然語言中,一個(gè)詞可以有多重含義,人們可以通過上下文和語氣來判斷該詞真實(shí)的含義,即該詞被重載了。前言中,女友對(duì)小C說的“你給我等著!”就是一個(gè)具有多重含義的詞。在不的情況下表達(dá)的意思不同。
在C語言中,當(dāng)兩個(gè)函數(shù)的函數(shù)名稱一模一樣的時(shí)候,我們的程序也會(huì)無法識(shí)別到底使用那個(gè)函數(shù)。于是C語言的大哥C++
在C語言的基礎(chǔ)上擴(kuò)充了函數(shù)重載。
函數(shù)重載:其實(shí)是函數(shù)的一種特殊情況,C++
允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 類型順序)不同,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
舉個(gè)C語言被慘拒的例子:
int Wait(int a)
{printf("寶貝!你真懂我!\n");
return a;
}
double Wait(double a)
{printf("分手吧!你根本不懂我!\n");
return a;
}
int main()
{Wait(1);
Wait(1.1);
return 0;
}
2、函數(shù)重載的分類
Ⅰ、參數(shù)類型不同為了解決C語言的情感問題,C++傳授給C語言的第一招,就是看女友(函數(shù))說話(定義)時(shí)的臉色(參數(shù)類型)。
C++現(xiàn)場撥通了女神的電話,向C語言進(jìn)行了展示:
int Wait(int a)
{printf("寶貝!你真懂我!\n");
return a;
}
double Wait(double a)
{printf("分手吧!你根本不懂我!\n");
return a;
}
int main()
{Wait(1);
Wait(1.1);
return 0;
}
看著C語言目瞪口呆的樣子,C++知道,這招C語言是學(xué)不會(huì)了。于是他準(zhǔn)備教小C第二招。
Ⅱ、參數(shù)個(gè)數(shù)不同C++傳授給C語言的第二招,就是看女友(函數(shù))說話(定義)時(shí)的情緒(參數(shù)個(gè)數(shù))。
C++現(xiàn)場撥通了第二個(gè)女神的電話,并再次向C語言進(jìn)行了展示:
void Wait()
{printf("寶貝!你真懂我!\n");
}
void Wait(double a)
{printf("分手吧!你根本不懂我!\n");
}
int main()
{Wait();
Wait(1.1);
return 0;
}
C++沒有說話,看著C,他決定把自己壓箱底的東西教給他。
C++傳授給C語言的第三招,就是看女友(函數(shù))說話(定義)時(shí)的動(dòng)作(參數(shù)類型順序)。
C++現(xiàn)場撥通了第三個(gè)女神的電話,并再次向C語言進(jìn)行了展示:
void Wait(int a , double b)
{printf("寶貝!你真懂我!\n");
}
void Wait(double a, int b)
{printf("分手吧!你根本不懂我!\n");
}
int main()
{Wait(1,2.2);
Wait(2.2,1);
return 0;
}
C++
明白,自己的老弟C語言永遠(yuǎn)不可能學(xué)會(huì)這一技能了。但是他還是把原理向C語言解釋了。
在C/C++
中,一個(gè)程序要運(yùn)行起來,需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接。
實(shí)際項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,當(dāng)前a.cpp
中調(diào)用了b.cpp
中定義的Add
函數(shù)時(shí),編譯后鏈接前,a.o
的目標(biāo)文件中沒有Add
的函數(shù)地址,因?yàn)?code>Add是在b.cpp
中定義的,所以Add
的地址在b.o
中。所以鏈接階段就是專門處理這種問題,鏈接器看到a.o
調(diào)用Add
,但是沒有Add
的地址,就會(huì)到b.o
的符號(hào)表中找Add
的地址,然后鏈接到一起。面對(duì)Add
函數(shù),鏈接接器會(huì)使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的函數(shù)名修飾規(guī)則。
在linux下,采用gcc編譯完成后,函數(shù)名字的修飾沒有發(fā)生改變。而采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中。
通過上面我們可以看出gcc的函數(shù)修飾后名字不變。而g++的函數(shù)修飾后變成【_Z+函數(shù)長度+函數(shù)名+類型首字母】。
Ⅱ、在Windows下Windows下名字修飾規(guī)則:
對(duì)比Linux會(huì)發(fā)現(xiàn),windows下vs編譯器對(duì)函數(shù)名字修飾規(guī)則相對(duì)復(fù)雜難懂,但道理都是類似的。
C語言沒辦法支持重載,就因?yàn)橥瘮?shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。
C++表示:如果兩個(gè)函數(shù)函數(shù)名和參數(shù)是一樣的,返回值不同。這樣是不構(gòu)成重載的,因?yàn)檎{(diào)用時(shí)編譯器沒辦法區(qū)分。
📢📢📢📢📢📢
💗 你正在閱讀【子夜的星】 的博客
👍 閱讀完畢,可以點(diǎn)點(diǎn)小手贊一下
🌻 發(fā)現(xiàn)錯(cuò)誤,直接評(píng)論區(qū)中指正吧
👑如果對(duì)你有用,記得點(diǎn)個(gè)關(guān)注哦
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧