摘要:事實(shí)上語(yǔ)言當(dāng)中有的內(nèi)容,比如函數(shù)循環(huán)結(jié)構(gòu)體宏等等內(nèi)容,也都有,所以大家千萬(wàn)不要認(rèn)為語(yǔ)言白學(xué)了哈因?yàn)橹耙呀?jīng)完整更新過(guò)語(yǔ)言的博客有需要可以往前翻,所以這里直接介紹相對(duì)語(yǔ)言當(dāng)中新增的內(nèi)容,而本章引入的內(nèi)容是的關(guān)鍵字命名空間缺省參數(shù)函數(shù)重載。
前言:首先感謝每一位老粉絲們的陪伴,從一開始的C語(yǔ)言初階到C語(yǔ)言進(jìn)階,作者用了三個(gè)月的時(shí)間才學(xué)完并更新完對(duì)應(yīng)的博客,后邊數(shù)據(jù)結(jié)構(gòu)初階部分(數(shù)據(jù)結(jié)構(gòu)進(jìn)階的內(nèi)容會(huì)混在C++當(dāng)中)又花了大概倆個(gè)多月的時(shí)間,接下來(lái)就開啟新篇章啦,進(jìn)入C++部分!
開篇之前先膜下 本賈尼·斯特勞斯特盧普 老爺子,希望大家C++學(xué)得都順利哈!!!
其實(shí)為什么一開始要先學(xué)習(xí)C語(yǔ)言,而不是一下子直接上手C++呢?因?yàn)樽髡弑救耸欠强瓢嗟膶W(xué)生,主要還是考慮到基礎(chǔ)必須打牢的原因!!!在確定轉(zhuǎn)碼的學(xué)習(xí)路線過(guò)程當(dāng)中作者本人也要到了不少985科班同學(xué)們的培養(yǎng)方案,與一些前輩們交流之后認(rèn)為C語(yǔ)言的學(xué)習(xí)對(duì)于后續(xù)計(jì)算機(jī)知識(shí)的學(xué)習(xí)會(huì)大有裨益。
事實(shí)上C語(yǔ)言當(dāng)中有的內(nèi)容,比如函數(shù)、循環(huán)、結(jié)構(gòu)體、宏等等內(nèi)容,C++也都有,所以大家千萬(wàn)不要認(rèn)為C語(yǔ)言白學(xué)了哈!因?yàn)橹耙呀?jīng)完整更新過(guò)C語(yǔ)言的博客(有需要可以往前翻),所以C++這里直接介紹C++相對(duì)C語(yǔ)言當(dāng)中新增的內(nèi)容,而本章引入的內(nèi)容是C++的關(guān)鍵字、命名空間、缺省參數(shù)、IO、函數(shù)重載。
我們?cè)贑語(yǔ)言中學(xué)習(xí)了32個(gè)關(guān)鍵字,既然C++是對(duì)C語(yǔ)言內(nèi)容的補(bǔ)充和添加,那么C++中也含有關(guān)鍵字,其中就除了C語(yǔ)言中的32個(gè)關(guān)鍵字,C++又新增了31個(gè)關(guān)鍵字,一共63個(gè)關(guān)鍵字。
相信這倆行代碼大部分讀者都見過(guò),但你知道第二行代碼using namespace std;
具體是干嘛的嗎?
#include using namespace std;
這就要先講講為什么會(huì)有命名空間了?
在C語(yǔ)言中,一個(gè)工程的建立我們可能需要?jiǎng)?chuàng)建大量的變量、函數(shù)、類等,而這些內(nèi)容都將存在于全局域中,如果在相同作用域下聲明相同名字變量,函數(shù)等編譯器將會(huì)報(bào)錯(cuò),于是為了解決這種情況,C++提出了命名空間的概念。
那為什么會(huì)有在相同作用域下聲明相同名字變量,函數(shù)的需求呢?
這是因?yàn)楫?dāng)所有人都在為同一個(gè)項(xiàng)目工作時(shí),一個(gè)工程項(xiàng)目的實(shí)現(xiàn)往往需要拆解成很多塊,具體給到不同的程序員手里,每個(gè)人負(fù)責(zé)的板塊不一樣,這樣就會(huì)出現(xiàn)一個(gè)問(wèn)題。比如程序員A和程序員B都要實(shí)現(xiàn)一個(gè)加法函數(shù)(這個(gè)加法函數(shù)具體功能可能不同),程序員A和程序員B可能都會(huì)想到為自己的加法函數(shù)起名為ADD,就會(huì)導(dǎo)致函數(shù)重名,編譯器報(bào)錯(cuò),所以需要命名空間。
定義 命名空間時(shí),我們現(xiàn)在知道需要namespace這個(gè)關(guān)鍵字,后面更加命名空間的名字,然后像創(chuàng)建一個(gè)函數(shù)一樣,用{}進(jìn)行內(nèi)容的包裹,而這其中的內(nèi)容就是命名空間的成員。一個(gè)命名空間就相當(dāng)于定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于命名空間中。
代碼1
定義個(gè)叫“l(fā)inmanman”的命名空間中,在這個(gè)空間中定義變量和函數(shù)
namespace linmanman{ int a = 10; int b = 20; int Add(int x, int y) { return x + y; }}
代碼2
命名空間的嵌套定義
namespace linmanman{ int a = 10; int b = 20; namespace lin { int x = 10; int y = 20; int Add(int x, int y) { return x + y; } }}
代碼3
命名空間可合并,當(dāng)有多個(gè)一樣的命名空間時(shí),編譯器會(huì)自動(dòng)將他們整合在一起。
namespace linmanman{ int a = 10; int b = 20; int Add(int x, int y) { return x + y; }}namespace linmanman{ int x = 10; int y = 20;}
namespace lin{ int a = 20; int b = 10;}using namespace lin;//關(guān)鍵字using的使用將命名空間展開到全局int main(){ printf("a的值為:%d/n", a); return 0;}
如
命名空間名::成員名
namespace lin{ int a = 20; int b = 10;}int main(){ printf("a的值為:%d/n", lin::a); //這里我們可以理解為作用域限定符"::"的使用,讓我們?cè)趌in這個(gè)命名空間中找到了a這個(gè)變量 return 0;}
namespace lin{ int a = 20; int b = 10;}using lin::a;//我們可以理解為我們將lin這個(gè)命名空間中變量a釋放,將其展開到全局int main(){ printf("a的值為:%d/n", a); return 0;}
同樣是“hellow world”,讓我們看看在C++這門編譯語(yǔ)言中,我們應(yīng)該如何實(shí)現(xiàn)這句代碼呢?在C++中的實(shí)現(xiàn)和C語(yǔ)言有什么區(qū)別呢?下面讓我們先看實(shí)現(xiàn)的代碼,然后我們?cè)龠M(jìn)行分析。
#include using namespace std;int main(){ cout << "Hellow world" << endl; double b; char c; cin >> b >> c; cout << b << " " << c << endl; return 0; }
知識(shí)點(diǎn)分析
1.使用cout標(biāo)準(zhǔn)輸出(控制臺(tái))和cin標(biāo)準(zhǔn)輸出(控制臺(tái))時(shí),必須包含頭文件以及std標(biāo)準(zhǔn)命名空間。
2.cin可以不再像scanf那樣該一個(gè)變量輸入值需要
取地址
且按照相應(yīng)的格式,比如%d
,cin的輸入格式為cin >> 變量名;
cout的使用不像c語(yǔ)言中的printf
一樣需要按照各種格式輸出,而是直接按照格式cout << 變量名;
3.有沒(méi)有注意到,C語(yǔ)言中輸入輸出需要考慮數(shù)據(jù)的類型,而在C++中進(jìn)行輸入輸出時(shí),是不需要考慮數(shù)據(jù)的類型的。
缺省參數(shù)是聲明或者定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值,在調(diào)用函數(shù)的時(shí),如果沒(méi)有指定實(shí)參則采用該默認(rèn)值,否則使用指定的實(shí)參。
實(shí)例:
void Test(int a = 1){ cout << a << endl;}int main(){ Test(); Test(100); return 0;}
分析:
在Test()中,沒(méi)有傳參,默認(rèn)使用缺省參數(shù),a的輸出值為1;
在Test(100)中,有傳參,這時(shí)不使用缺省參數(shù),a的輸出值為100。
所有參數(shù)我們都將其設(shè)置為缺省參數(shù)
void Test(int a = 10; int b = 20; int c = 30){ cout << "a = " << a << endl; cout << "a = " << b << endl; cout << "a = " << c << endl;}
將函數(shù)中的部分參數(shù)設(shè)置為缺省參數(shù),注意缺省參數(shù)其必須從右到左設(shè)置,且不能間隔設(shè)置。
void TestFunc(int a, int b = 10, int c = 20){ cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl;}
缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),原因一樣,所以一般是在聲明中寫默認(rèn)參數(shù)。
函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。
舉例如下代碼均為函數(shù)重載
函數(shù)返回類型無(wú)所謂,關(guān)鍵在于形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同。
int Add(int a, int b){ return a + b;}int Add(int a, double b){ return a + b;}double Add(double a, double b){ return a + b;}
我們知道,c程序在鏈接階段,會(huì)把所有目標(biāo)文件進(jìn)行整合,最終形成.exe文件,而在整合過(guò)程中,會(huì)有一步符號(hào)表匯聚,所以,在c語(yǔ)言中如果有多個(gè)相同名字的函數(shù),鏈接階段將不知道所調(diào)用的函數(shù)到底是同名函數(shù)中的具體哪一個(gè),進(jìn)而導(dǎo)致編譯器報(bào)錯(cuò)。
那為什么C語(yǔ)言會(huì)有函數(shù)重載,編譯器不會(huì)報(bào)錯(cuò)呢?
因?yàn)樵贑++中,形成符號(hào)表的時(shí)候,會(huì)對(duì)重名函數(shù)進(jìn)行修飾,修飾原則是_Z n name t.其中n是函數(shù)名長(zhǎng)度,name是函數(shù)名,t是所有參數(shù)類型的首字母縮寫.
例如
int Add(int a, int b){ return a + b;}int Add(int a, double b){ return a + b;}
當(dāng)我們?cè)贑++的環(huán)境中時(shí),我們通過(guò)編譯的一些方式可以獲得如下內(nèi)容,能觀察到函數(shù)重載之后這倆Add函數(shù)的地址是不同的。
我們清楚了函數(shù)重載的原理,要求參數(shù)不同,這樣修飾出來(lái)的名字也就不同了。
結(jié)論:不行!
比如以下這倆func函數(shù),僅僅是函數(shù)返回值不同,嘗試把返回值引入修飾規(guī)則當(dāng)中,即便編譯器層面過(guò)得去,語(yǔ)法調(diào)用層面也很難通過(guò)!
C++的關(guān)鍵字、命名空間、缺省參數(shù)、IO、函數(shù)重載內(nèi)容到此介紹結(jié)束了,感謝您的閱讀!!!如果內(nèi)容對(duì)你有幫助的話,記得給我三連(點(diǎn)贊、收藏、關(guān)注)——做個(gè)手有余香的人。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/122333.html
摘要:在大型的工程中,自己定義的變量函數(shù),類名與其他人定義的相沖突等問(wèn)題。使用標(biāo)準(zhǔn)輸出控制臺(tái)和標(biāo)準(zhǔn)輸入鍵盤時(shí),必須包含頭文件以及標(biāo)準(zhǔn)命名空間。缺省參數(shù)概念缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。 目錄 前言 1.命名空間 1.1命名空間定義 1.2 命名空間使用 2. C++的輸入和...
摘要:中包含的即為命名空間的成員。使用輸入輸出更方便,不需增加數(shù)據(jù)格式控制,比如整形,字符可以連續(xù)輸出,表示換行缺省參數(shù)備胎,就是給汽車準(zhǔn)備一個(gè)備用輪胎,一旦那個(gè)輪子爆胎或者出了問(wèn)題,備用輪胎就方便及時(shí)地取而代之,汽車就不至于中途拋錨。 ...
摘要:使用輸入輸出更方便,不需增加數(shù)據(jù)格式控制,比如整形,字符等缺省參數(shù)備胎缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。此外,函數(shù)重載要求參數(shù)不同,而跟返回值沒(méi)關(guān)系。 ...
摘要:上面這三種均不造成重載,現(xiàn)在來(lái)說(shuō)明原因。結(jié)論對(duì)于引用返回,返回的對(duì)象必須是棧幀銷毀后還存在的。全局,靜態(tài),未銷毀的函數(shù)棧幀當(dāng)中的都是可以的指針與引用如圖兩者底層實(shí)現(xiàn)差不多,引用是用指針模擬的。不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。 ...
摘要:使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。缺省參數(shù)概念缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。 ...
閱讀 3925·2021-10-12 10:12
閱讀 2886·2021-09-10 11:18
閱讀 3672·2019-08-30 15:54
閱讀 2808·2019-08-30 15:53
閱讀 638·2019-08-30 13:54
閱讀 965·2019-08-30 13:21
閱讀 2259·2019-08-30 12:57
閱讀 1687·2019-08-30 11:10