網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、 前言
C++中的using namespace std
是什么意思呢?為了理解其中的含義,我們首先需要學(xué)習(xí)一個(gè)概念叫做命名空間。
我們都知道,C語(yǔ)言規(guī)定變量名不能與關(guān)鍵字沖突,但是并沒(méi)有規(guī)定變量名不能與庫(kù)中的變量名沖突,但這在實(shí)際的操作的過(guò)程中就會(huì)產(chǎn)生意想不到的錯(cuò)誤:
例如,將一個(gè)time變量放在main函數(shù)中,根據(jù)局部?jī)?yōu)先的原則,time變量就會(huì)被理解為一個(gè)局部變量。但當(dāng)time作為一個(gè)全局變量出現(xiàn)的時(shí)候,由于time庫(kù)中也含有一個(gè)名叫time的函數(shù)名,頭文件被展開(kāi)后,此time被理解為變量名還是函數(shù)名就會(huì)產(chǎn)生歧義。
而C++中出現(xiàn)的命名空間概念就是為了填C語(yǔ)言中的這個(gè)坑。
?總結(jié):同一個(gè)域中不能出現(xiàn)兩個(gè)重名的變量名/函數(shù)名,而命名空間的提出就是為了對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以此解決命名污染的問(wèn)題,其作用就是定義一個(gè)新的作用域
二、作用域分解運(yùn)算符
在講命名空間的時(shí)候首先給大家介紹一個(gè)作用域分解運(yùn)算符 " :: " 。
?使用說(shuō)明
? A,B表示兩個(gè)類,而在A,B中都有成員member
- A :: member表示類A成員中的member
- B :: member表示類B成員中的member
當(dāng)前面的類不指定的時(shí)候,默認(rèn)為全局
前面說(shuō)到變量名沖突的時(shí)候遵循局部?jī)?yōu)先原則,那么我們能不能就想訪問(wèn)到全局變量呢?我們就可以通過(guò)作用域分解運(yùn)算符實(shí)現(xiàn):
三、命名空間使用介紹
namespace my_variant { int time = 10; } int main() { printf("%d", my_variant::time); }
?基本介紹①
- namespace是一個(gè)C++中的一個(gè)關(guān)鍵字
- 我們將變量定義在自己創(chuàng)建的my_variant命名空間,以避免被污染
- 訪問(wèn)命名空間中的變量,需要使用作用域分解運(yùn)算符
- 命名空間只能定義在全局,其中定義的變量為全局變量
namespace my_variant { int time = 10; typedef struct Stu { char name[10]; int age; int score; }Stu; namespace _variant { int Add(int a, int b) { return a + b; } } } int main() { my_variant::Stu data = {0}; int ret = my_variant::_variant::Add(1, 2); }
?基本介紹②
- 從上面我們可以看到命名空間中過(guò)的內(nèi)容不只局限于變量名,也可以是函數(shù)名,類型名
- 命名空間可以無(wú)限次嵌套命名空間,同樣的使用里面的內(nèi)容的時(shí)候也需要多次使用作用域分解運(yùn)算符——一層一層對(duì)應(yīng)的關(guān)系。使用嵌套命名空間可以解決命名空間內(nèi)部的命名沖突
- 一個(gè)工程中同名的命名空間最終會(huì)被合并為一個(gè)命名空間
當(dāng)然我們可以看到,每次要使用命名空間中的變量都需要寫很多額外的內(nèi)容,有沒(méi)有什么辦法可以簡(jiǎn)化操作呢——我們想要訪問(wèn)命名空間中的space_b有兩種方法:
namespace space_a { int a1 = 1; int a2 = 2; namespace space_b { int b1 = 10; int b2 = 20; int b3 = 30; } namespace space_c { int c1 = 5; int c2 = 6; } }
using namespace space_a; using namespace space_b;
方法①:首先將space_a中的內(nèi)容全部釋放出來(lái),再釋放其中的space_b的內(nèi)容(注意順序不能顛倒,否則space_b認(rèn)不出來(lái))
using namespace space_a:: space_b;
方法②:用什么放什么。只是將space_b中全部的內(nèi)容釋放出來(lái),而不會(huì)對(duì)其他的內(nèi)容產(chǎn)生影響。
釋放出來(lái)之后我們便可以愉快自由的使用了:
四、using namespace std
經(jīng)過(guò)上面的學(xué)習(xí),我們不難理解using name std
的作用是釋放std命名空間中的變量名,函數(shù)名以及類型名,其中std是C++標(biāo)準(zhǔn)庫(kù)的命名空間。
我們?cè)跁鴮懘a的時(shí)候?yàn)榱朔奖阌谑菍++標(biāo)準(zhǔn)庫(kù)中的命名空間完全展開(kāi)了,但是最好的做法我想還是用什么放什么。
另外,標(biāo)準(zhǔn)C++庫(kù)中提供兩種頭文件,前面以C開(kāi)頭的頭文件是支持命名空間的,而后者是不支持的。
總結(jié)?
原文鏈接:https://blog.csdn.net/whc18858/article/details/124588910
相關(guān)推薦
- 2022-08-15 Property or field ‘xxx‘ cannot be found on object
- 2022-12-15 C#入?yún)⑹褂靡妙愋鸵觬ef的原因解析_C#教程
- 2022-08-23 python畫圖中文不顯示問(wèn)題的解決方法_python
- 2023-12-11 Mybatis數(shù)據(jù)庫(kù)操作筆記(Mybatis基礎(chǔ)CRUD代碼)
- 2022-09-19 Python使用read_csv讀數(shù)據(jù)遇到分隔符問(wèn)題的2種解決方式_python
- 2022-03-30 Android中圖片占用內(nèi)存的深入分析_Android
- 2022-02-16 mac 使用launchctl 開(kāi)機(jī)時(shí)加速vim、emacs
- 2022-04-12 【debug】PytorchStreamReader failed reading zip arch
- 最近更新
-
- 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)程分支