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