網(wǎng)站首頁 編程語言 正文
命名空間的特性
首先熟悉一下命名空間的兩個概念。
聲明區(qū)域:可以在其中進(jìn)行聲明的區(qū)域,如全局文件的聲明區(qū)域是文件,函數(shù)內(nèi)聲明的變量聲明區(qū)域為代碼塊。潛在作用域:潛在作用域從聲明點開始,到其聲明區(qū)域的結(jié)尾。因此潛在作用域比聲明區(qū)域小,因為變了必須定義后才能使用。
這兩個概念通過下圖很好理解,也是編程的常識。
聲明命名空間和命名空間成員
可以使用如下語法聲明命名空間和空間成員
namespace Jack { double a; struct b {}; void f(); }
全局命名空間
如果未在顯式命名空間中聲明某個標(biāo)識符,則該標(biāo)識符屬于隱式全局命名空間的一部分。 一般情況下,嘗試避免在全局范圍內(nèi)進(jìn)行聲明(入口點 Main 函數(shù)除外,它必須位于全局命名空間中)。
全局命名空間可以是用 ::var
來調(diào)用。
不連續(xù)命名空間
即同一個命名空間可以在多個文件中定義,如
file1.cpp
namesapce A { int a; }
file2.cpp
namesapce A { int b; }
在編譯時會將分散在各個文件中的同一個命名空間集合在一起。
嵌套命名空間
命名空間也是可以嵌套的
namespace A { namespace B {} }
using聲明和using編譯指令
using聲明將特定的名稱添加到它所屬的聲明區(qū)域中,例如using A::a;
,相當(dāng)于 Java 中的靜態(tài)導(dǎo)入,而using 編譯指令使名稱空間的所有名稱都可以用,而不需要使用作用于解析符,如 using namespace std;
,作用相當(dāng)于 Java 中的。import java.util.*
。這里記錄一下注意點。
using A::pal; using B::pal; // error declaration conflict pal = 4;
上述代碼會引起沖突。
一般而言使用using聲明會更安全點。
命名空間別名
命名空間名稱必須是唯一的,這意味著通常它們不應(yīng)太短。 如果名稱的長度使代碼難以讀取,或在不能使用 using 指令的標(biāo)頭文件中鍵入枯燥,則可以創(chuàng)建一個命名空間別名作為實際名稱的縮寫。 例如:
namespace a_very_long_namespace_name { class Foo {}; } namespace AVLNN = a_very_long_namespace_name; void Bar(AVLNN::Foo foo){ }
綜合代碼示例
#include <iostream> using namespace std; namespace A { int a = 100; namespace B //嵌套一個命名空間B { int a = 20; } } int a = 200;//定義一個全局變量 int main(int argc, char *argv[]) { cout << "A::a =" << A::a << endl; cout << "A::B::a =" << A::B::a << endl; cout << "a =" << a << endl; cout << "::a =" << ::a << endl; int a = 30; cout << "a =" << a << endl; cout << "::a =" << ::a << endl; return 0; }
output:
A::a =100
A::B::a =20
a =200
::a =200
a =30
::a =200
總結(jié)
原文鏈接:https://blog.csdn.net/EJoft/article/details/122900592
相關(guān)推薦
- 2022-10-01 一文詳解C#?Chart控件_C#教程
- 2024-04-02 Centos無法獲取IP報No suitable device found for this con
- 2022-09-20 C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表操作詳解_C 語言
- 2023-01-02 Android?Map數(shù)據(jù)結(jié)構(gòu)全面總結(jié)分析_Android
- 2022-06-15 詳解Python進(jìn)行數(shù)據(jù)相關(guān)性分析的三種方式_python
- 2022-03-31 Go中變量命名規(guī)則與實例_Golang
- 2022-06-02 Python?推導(dǎo)式、生成器與切片問題解決思路_python
- 2022-11-05 Kotlin方法與Lambda表達(dá)式實踐使用介紹_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支