網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、命名空間
為什么引入命名空間
在C++中,變量、函數(shù)和類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace
關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。
?? ?int a = 10; ?? ? ?? ?int main(void) ?? ?{ ?? ??? ?int a = 10; ?? ??? ?return 0; ?? ?}
這里一個(gè)a是全局變量,一個(gè)a是局部變量。可以編譯通過(guò)。
int a = 10; int a = 20; int main(void) { int a = 10; return 0; }
當(dāng)有兩個(gè)全局變量a時(shí),命名沖突了,編譯不過(guò)。
舉例說(shuō)明,假如1班和2班都有名字叫張三的同學(xué),當(dāng)一班和二班站在一起時(shí),老師叫張三就會(huì)出現(xiàn)歧義,不知道叫的是一班的還是二班的。但是如果老師叫一班的張三或二班的張三,就不會(huì)出現(xiàn)歧義和錯(cuò)誤。這里的一班和二班就相當(dāng)于命名空間。
命名空間定義
定義命名空間,需要使用到namespace
關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{}中即為命名空間的成員。
?? ?namespace bc?? ?//bc為命名空間的名字 ?? ?{ ?? ??? ?//命名空間的成員 ?? ??? ?int a = 100;?? ? ?? ??? ?int ADD(int a, int b) ?? ??? ?{ ?? ??? ??? ?return a + b; ?? ??? ?} ?? ?}
命名空間中的內(nèi)容,可以是類、變量、函數(shù)、模板和其它命名空間。
命名空間可以嵌套
?? ?namespace FPX ?? ?{ ?? ??? ?int a = 5; ?? ??? ?namespace doinb ?? ??? ?{ ?? ??? ??? ?int b = 5; ?? ??? ??? ?void Champion() ?? ??? ??? ?{ ?? ??? ??? ??? ?cout << "FPX2021WIN" << endl; ? ? ? ?? ?? ??? ??? ?} ?? ??? ?} ?? ?}
同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中。
同時(shí)也意味著在名字相同的命名空間中的命名是不能沖突的。
使用命名空間
有以下命名空間:
??
?namespace bc ?? ?{ ?? ??? ?int m = 10; ?? ??? ?int n = 20; ?? ? ?? ??? ?int Add(int a, int b) ?? ??? ?{ ?? ??? ??? ?return a + b; ?? ??? ?} ?? ? ?? ??? ?int Max(int a, int b) ?? ??? ?{ ?? ??? ??? ?return a > b ? a : b; ?? ??? ?} ?? ?}
1.使用using聲明將命名空間全部展開到全局。
?? ?using namespace bc;
這樣命名空間中的內(nèi)容就可以像全局一樣直接使用。
?? ?int a = 10; ?? ?int b = 20; ?? ?cout << Add(a, b) << endl; ?? ?cout << Max(a, b) << endl;
這種方法的優(yōu)點(diǎn)是使用起來(lái)非常方便,缺點(diǎn)是把自己的定義都暴露出去了,導(dǎo)致命名污染。
2.訪問(wèn)命名空間的內(nèi)容時(shí),指定命名空間。
?? ?int a = 10; ?? ?int b = 20; ?? ?cout << bc::Add(a, b) << endl; ?? ?cout << bc::Max(a, b) << endl;
::為作用域運(yùn)算符,前綴bc::指出函數(shù)Add和Max是定義在名為bc的命名空間中的。通過(guò)作用域運(yùn)算符(::)來(lái)指出我們想使用定義在命名空間bc中的名字Add和Max。
這種方法的優(yōu)點(diǎn)是不存在命名污染,缺點(diǎn)是用起來(lái)太麻煩,每個(gè)都要去指定命名空間。
3.可以把常用的展開
比如Add函數(shù)是常用的:
?? ?using bc::Add;
以后使用Add函數(shù)時(shí)就不需要指定命名空間。
這種方法不會(huì)造成大面積的命名污染,把常用的展開,使用時(shí)也很方便。
位于頭文件的代碼一般來(lái)說(shuō)不應(yīng)該使用using
聲明。因?yàn)轭^文件的內(nèi)容會(huì)拷貝到所有引用它的文件中,如果頭文件里有某個(gè)using聲明,那么每個(gè)使用了該頭文件的文件就都會(huì)有這個(gè)聲明。對(duì)于某些程序來(lái)說(shuō),由于不經(jīng)意間包含了一些名字,反而可能產(chǎn)生名字沖突。
標(biāo)準(zhǔn)命名空間
C++ 引入了命名空間的概念,計(jì)劃重新編寫庫(kù),將類、函數(shù)、宏等都統(tǒng)一納入一個(gè)命名空間,這個(gè)命名空間的名字就是std。std 是 standard
的縮寫,意思是“標(biāo)準(zhǔn)命名空間”。
二、缺省參數(shù)
缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該默認(rèn)值,否則使用指定的實(shí)參。
??
?void TestFunc(int a = 0)?? ?//參數(shù)缺省值 ?? ?{ ?? ??? ?cout << a << endl; ?? ?} ?? ? ?? ?int main(void) ?? ?{ ?? ??? ?TestFunc();?? ??? ?//沒有傳參數(shù),使用參數(shù)的默認(rèn)值 ?? ??? ?TestFunc(10);?? ?//傳參數(shù)時(shí),使用指定的參數(shù) ?? ??? ?return 0; ?? ?}
三、缺省參數(shù)分類
全缺省參數(shù)
所有的參數(shù)都給出缺省值:
?? ?void TestFunc(int a = 10, int b = 20, int c = 30) ?? ?{ ?? ??? ?cout << "a = " << a << endl; ?? ??? ?cout << "b = " << b << endl; ?? ??? ?cout << "c = " << c << endl; ?? ?}
半缺省參數(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ù)必須從右往左依次來(lái)給出,不能間隔著給。
缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)。
缺省值必須是常量或者全局變量。
原文鏈接:https://blog.csdn.net/weixin_45806959/article/details/120514285
相關(guān)推薦
- 2022-09-14 jQuery實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能_jquery
- 2022-06-28 python遞歸實(shí)現(xiàn)鏈表快速倒轉(zhuǎn)_python
- 2023-10-31 IP地址、網(wǎng)關(guān)、網(wǎng)絡(luò)/主機(jī)號(hào)、子網(wǎng)掩碼關(guān)系
- 2022-03-22 .NET?6開發(fā)TodoList開發(fā)查詢分頁(yè)_實(shí)用技巧
- 2023-02-06 詳解C#如何加密解密RAR文件_C#教程
- 2022-10-19 Android項(xiàng)目中引入aar包的正確方法介紹_Android
- 2022-08-29 Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程_python
- 2023-10-27 np.array()函數(shù)的使用方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支