C++中的命名空間詳細(xì)介紹
命名空間的特性
首先熟悉一下命名空間的兩個(gè)概念。
聲明區(qū)域:可以在其中進(jìn)行聲明的區(qū)域,如全局文件的聲明區(qū)域是文件,函數(shù)內(nèi)聲明的變量聲明區(qū)域?yàn)榇a塊。潛在作用域:潛在作用域從聲明點(diǎn)開始,到其聲明區(qū)域的結(jié)尾。因此潛在作用域比聲明區(qū)域小,因?yàn)樽兞吮仨毝x后才能使用。
這兩個(gè)概念通過下圖很好理解,也是編程的常識(shí)。
聲明命名空間和命名空間成員
可以使用如下語法聲明命名空間和空間成員
namespace Jack { double a; struct b {}; void f(); }
全局命名空間
如果未在顯式命名空間中聲明某個(gè)標(biāo)識(shí)符,則該標(biāo)識(shí)符屬于隱式全局命名空間的一部分。 一般情況下,嘗試避免在全局范圍內(nèi)進(jìn)行聲明(入口點(diǎn) Main 函數(shù)除外,它必須位于全局命名空間中)。
全局命名空間可以是用 ::var
來調(diào)用。
不連續(xù)命名空間
即同一個(gè)命名空間可以在多個(gè)文件中定義,如
file1.cpp
namesapce A { int a; }
file2.cpp
namesapce A { int b; }
在編譯時(shí)會(huì)將分散在各個(gè)文件中的同一個(gè)命名空間集合在一起。
嵌套命名空間
命名空間也是可以嵌套的
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.*
。這里記錄一下注意點(diǎn)。
using A::pal; using B::pal; // error declaration conflict pal = 4;
上述代碼會(huì)引起沖突。
一般而言使用using聲明會(huì)更安全點(diǎn)。
命名空間別名
命名空間名稱必須是唯一的,這意味著通常它們不應(yīng)太短。 如果名稱的長度使代碼難以讀取,或在不能使用 using 指令的標(biāo)頭文件中鍵入枯燥,則可以創(chuàng)建一個(gè)命名空間別名作為實(shí)際名稱的縮寫。 例如:
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 //嵌套一個(gè)命名空間B { int a = 20; } } int a = 200;//定義一個(gè)全局變量 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é)
到此這篇關(guān)于C++中的命名空間詳細(xì)介紹的文章就介紹到這了,更多相關(guān)C++命名空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++ boost::asio編程-同步TCP詳解及實(shí)例代碼
這篇文章主要介紹了C++ boost::asio編程-同步TCP詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合
這篇文章主要為大家詳細(xì)介紹了opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法
這篇文章主要介紹了C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07C++ COM編程之QueryInterface函數(shù)(一)
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(一),QueryInterface是組件本身提供對(duì)自己查詢的一個(gè)接口,需要的朋友可以參考下2014-10-10