C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)
一:命名空間
1.命名空間的意義 ① 在一個(gè)大型項(xiàng)目中,往往會(huì)有很多函數(shù)、類、變量等,如果不加以限制,不同的函數(shù)或類很可能會(huì)使用相同的名稱,這樣就會(huì)產(chǎn)生沖突。 ② 為了解決這個(gè)問(wèn)題,C++引入了命名空間的概念,可以把相關(guān)的函數(shù)、類、變量等放在同一個(gè)命名空間下,從而避免沖突。 ③ 同時(shí),命名空間還可以提高程序的可讀性和可維護(hù)性,方便例如debug的時(shí)候定位問(wèn)題。
2.命名空間的定義 定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{} 中即為命名空間的成員。代碼:
//命名空間 namespace stu { //命名空間中可以定義變量/函數(shù)/類型 int Add(int x, int y) { return x + y; } int goal = 50; struct Node { int data; struct Node* next; }; //命名空間可以嵌套定義 namespace teacher { //命名空間中可以定義變量/函數(shù)/類型 int Add(int x, int y) { return x + y; } int goal = 100; struct Node { int data; struct Node* next; }; } }
注意:一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中。
3.如何使用命名空間中成員?
①加命名空間名稱及作用域限定符代碼:
?#include <stdio.h> //命名空間 namespace stu { //命名空間中可以定義變量/函數(shù)/類型 int Add(int x, int y) { return x + y; } int goal = 50; struct Node { int data; struct Node* next; }; //命名空間可以嵌套定義 namespace teacher { //命名空間中可以定義變量/函數(shù)/類型 int Add(int x, int y) { return x + y; } int goal = 100; struct Node { int data; struct Node* next; }; } } int main() { printf("%d\n", stu::goal); printf("%d\n",stu::teacher::goal); } ?
②使用using將命名空間中某個(gè)成員引入
代碼:
using stu::goal; //如果想使用嵌套空間中的goal,可以用using stu::teacher::goal //但是兩個(gè)不能同時(shí)存在,否則會(huì)導(dǎo)致多次聲明 int main() { printf("%d\n",goal); }
③使用using namespace命名空間名稱引入(相當(dāng)于把命名空間全部展開)
代碼:
using namespace stu; //想訪問(wèn)嵌套空間的goal,可以u(píng)sing namespace stu::teacher //但是兩個(gè)不能同時(shí)存在,否則goal不明確 int main() { printf("%d\n",goal); }
小結(jié)① C++中即使是一些比較重要的聲明定義(比如與輸出有關(guān)的cout),也是放在一個(gè)命名空間中的,在沒(méi)有展開命名空間或者引入成員的情況下,cout是可以做變量,函數(shù)名的。 ②如果要寫一個(gè)較大的項(xiàng)目,上面三種使用命名空間中成員的方法 直接引入命名空間(展開)的方式是非常不好的,很容易造成命名沖突 (using namespace 命名空間)如果并不需要頻繁使用,我們可以用加命名空間名稱及作用域限定符的方式來(lái)使用
(命名空間::成員)
如果只是需要頻繁使用某一個(gè)成員,我們可以使用using將命名空間中單個(gè)成員引入
(using 命名空間::成員)③可以存在多個(gè)同名的命名空間,編譯器最后會(huì)把他們合成一個(gè)。
(比如定義兩個(gè)同名命名空間,展開之后兩個(gè)空間中的成員都可以使用)
二:C++的輸入輸出
代碼:
說(shuō)明:
①使用cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái))和cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤)時(shí),必須包含< iostream >頭文件以及按命名空間使用方法使用std。
②這里涉及到了類和對(duì)象、運(yùn)算符重載、IO流、函數(shù)重載的知識(shí),大家只需要先有個(gè)大致印象,后續(xù)的學(xué)習(xí)會(huì)一一解答這里的疑問(wèn)。
●cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在< iostream >頭文件中。
● <<是流插入運(yùn)算符, >> 是流提取運(yùn)算符。 ●使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。 C++的輸入輸出可以自動(dòng)識(shí)別變量類型(本質(zhì)是函數(shù)重載)③早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)頭文件即可,后來(lái)將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間, 規(guī)定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支持<iostream.h>格式,后續(xù)編譯器已不支持,因此推薦使用<iostream>+std的方式。
三:函數(shù)重載
1.概念 是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 類型順序)不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。
2.實(shí)例代碼:
?#include <iostream> using namespace std; 函數(shù)重載 void fun(int x, int y) { cout << "int x,int y" << endl; } void fun(double x, double y) { cout << "double x,double y" << endl; } void fun() { cout << "NULL" << endl; } int main() { fun(2, 0); //參數(shù)類型不同 fun(2.0, 0.0); //參數(shù)個(gè)數(shù)不同 fun(); return 0; } ?
注意:函數(shù)返回值不同不構(gòu)成函數(shù)重載。
3.為什么C++能支持函數(shù)重載而C不行?其實(shí)主要就是一句:C++有獨(dú)特的函數(shù)名修飾規(guī)則。
一個(gè)C/C++程序的形成需要經(jīng)過(guò)預(yù)處理、編譯、匯編、鏈接。
①預(yù)處理:進(jìn)行宏的替換、頭文件展開、注釋的刪除(空格替換)。
②編譯:將代碼轉(zhuǎn)化為匯編代碼(這個(gè)階段主要負(fù)責(zé)語(yǔ)法分析、符號(hào)匯總、
詞法分析、語(yǔ)義分析)。
③匯編:將匯編代碼轉(zhuǎn)化為二進(jìn)制機(jī)器指令,生成符號(hào)表。
④鏈接:匯編完成后會(huì)把對(duì)應(yīng)源文件生成目標(biāo)文件,鏈接階段就是把這些目標(biāo)文件
進(jìn)行鏈接(這個(gè)過(guò)程很復(fù)雜)。
我們并不需要很在意這個(gè)過(guò)程的實(shí)現(xiàn)細(xì)節(jié),要點(diǎn)在符號(hào)匯總和生成符號(hào)表。
【1】先看一段C語(yǔ)言代碼
main.c文件中沒(méi)有Add函數(shù)的定義,但是存在聲明,沒(méi)有語(yǔ)法錯(cuò)誤,可以通過(guò)編譯。
Add.c文件中包含了Add函數(shù)的具體實(shí)現(xiàn)。
匯編完成后這兩個(gè)源文件會(huì)生成對(duì)應(yīng)符號(hào)表。
鏈接的過(guò)程中會(huì)進(jìn)行符號(hào)表的合并,在main.obj(main.c匯編完成后生成的目標(biāo)文件)中沒(méi)有Add函數(shù)的定義,但是Add.obj中有,最后合并為_Add(0x200),可以找到Add函數(shù)的地址進(jìn)行調(diào)用。
在上述基礎(chǔ)上如果我們多定義一個(gè)同名函數(shù),生成的符號(hào)表中兩個(gè)函數(shù)地址都是有效的,無(wú)法區(qū)分應(yīng)該調(diào)用那個(gè),就會(huì)導(dǎo)致鏈接錯(cuò)誤。
我們不難發(fā)現(xiàn),C語(yǔ)言沒(méi)辦法處理這種情況是因?yàn)榉?hào)名相同導(dǎo)致的沖突,如果我們?cè)谏煞?hào)表的時(shí)候依據(jù)函數(shù)參數(shù)的不同來(lái)生成不同符號(hào)名,不就可以解決這種情況了嗎?
【2】我們把上面的情況放到C++
通過(guò)這里就理解了C語(yǔ)言沒(méi)辦法支持重載,因?yàn)橥瘮?shù)沒(méi)辦法區(qū)分。而C++是通過(guò)函數(shù)修飾規(guī)則來(lái)區(qū)分,只要參數(shù)不同,修飾出來(lái)的名字就不一樣,就支持了重載。
其中返回值并沒(méi)有納入修飾規(guī)則,因此只有返回值不同無(wú)法構(gòu)成函數(shù)重載。
四:缺省參數(shù)
1.概念 缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒(méi)有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。 2.實(shí)例
【2】半缺省參數(shù)
4.注意點(diǎn)①半缺省參數(shù)必須從右往左依次來(lái)給出,不能間隔著給
②缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),建議缺省參數(shù)只在聲明中設(shè)定
③缺省值必須是常量和全局變量
到此這篇關(guān)于C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)的文章就介紹到這了,更多相關(guān)C++命名空間、函數(shù)重載、缺省參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(25.每k個(gè)一組翻轉(zhuǎn)鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(25.每k個(gè)一組翻轉(zhuǎn)鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08詳解利用C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長(zhǎng)時(shí)間高效的運(yùn)行,通過(guò)對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下2021-08-08c++ class中成員與分配內(nèi)存的問(wèn)題詳解
很多人都知道C++類是由結(jié)構(gòu)體發(fā)展得來(lái)的,所以他們的成員變量(C語(yǔ)言的結(jié)構(gòu)體只有成員變量)的內(nèi)存分配機(jī)制是一樣的,下面這篇文章主要給大家介紹了關(guān)于c++ class中成員與分配內(nèi)存問(wèn)題的相關(guān)資料,需要的朋友可以參考下2021-10-10C語(yǔ)言實(shí)現(xiàn)BMP圖像開運(yùn)算處理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像開運(yùn)算處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10關(guān)于vs strcpy_s()和strcat_s()用法探究
這篇文章主要介紹了關(guān)于vs strcpy_s()strcat_s()用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C語(yǔ)言實(shí)現(xiàn)在控制臺(tái)打印余弦曲線
余弦曲線又叫余弦波(cosinwave),是一種來(lái)自數(shù)學(xué)三角函數(shù)中的余弦比例的曲線。這篇文章主要為大家介紹了如何在控制臺(tái)繪制余弦曲線,感興趣的可以了解一下2023-02-02