C++命名空間實(shí)例解析
命名空間是C++非常重要的概念,本文就以實(shí)例形式對(duì)其進(jìn)行深入分析,具體內(nèi)容如下:
通常來(lái)說(shuō),在C++中,命名空間(namespace)的目的是為了防止名字沖突。每個(gè)命名空間是一個(gè)作用域,在所有命名空間之外,還存在一個(gè)全局命名空間(global namespace),全局命名空間以隱式的方式聲明,它并沒(méi)有名字。在命名空間機(jī)制中,原來(lái)的全局變量,就是位于全局命名空間中(可以用::member的形式表示)。
一、定義命名空間
1、每個(gè)命名空間都是一個(gè)作用域
和其他作用域類(lèi)似,在命名空間中的每個(gè)名字必須表示唯一實(shí)體,而在不同命名空間中,可以有相同名字的成員。
2、命名空間可以是不連續(xù)的
命名空間可以定義在幾個(gè)不同的部分:
namespace nsp { /* …… */ } // 命名空間作用域后面無(wú)須分號(hào)
如果之前沒(méi)有名為nsp的命名空間定義,則上述代碼創(chuàng)建一個(gè)新的命名空間;否則,上述代碼打開(kāi)已經(jīng)存在的命名空間添加一些新的成員。
3、命名空間是可以嵌套的
嵌套的命名空間是指定義在其他命名空間中的命名空間。嵌套的命名空間是一個(gè)嵌套的作用域,內(nèi)層命名空間聲明的名字將隱藏外層命名空間聲明的同名成員:
int x = 20; namespace outer { int x = 10; namespace inner { int z = x; } } int main() { std::cout << outer::inner::z; // 輸出10 return 0; }
注意,通常我們不把#include頭文件放在命名空間內(nèi)部。
4、未命名的命名空間
未命名的命名空間(unnamed namespace)是指關(guān)鍵字namespace后緊跟花括號(hào)括起來(lái)的一系列聲明語(yǔ)句。未命名的命名空間中定義的變量擁有靜態(tài)生命周期:它們?cè)诘谝淮问褂们皠?chuàng)建,并且直到程序結(jié)束才銷(xiāo)毀。在標(biāo)準(zhǔn)C++引入命名空間的概念之前,程序需要將名字聲明成static以使其對(duì)于整個(gè)文件有效,但是,現(xiàn)在在文件中進(jìn)行靜態(tài)聲明的做法已經(jīng)被C++標(biāo)準(zhǔn)取消了,取而代之的是使用未命名的命名空間。
一個(gè)未命名的命名空間可以在某個(gè)給定的文件內(nèi)不連續(xù),但是不能跨越多個(gè)文件。也就是說(shuō),未命名的命名空間僅在特定的文件內(nèi)部有效,其作用范圍不會(huì)橫跨多個(gè)不同的文件。另外,由于未命名的命名空間它沒(méi)有名字,所以其中定義的名字的作用域與該命名空間所在的作用域相同:
int i; // i的全局聲明 namespace { int i; } i = 10; // 錯(cuò)誤,二義性
namespace local { namespace { int i; } } local::i = 42; // 正確
二、使用命名空間
對(duì)命名空間中成員的引用,需要使用命名空間的作用域運(yùn)算符(::)。但是,像namespace_name::member_name這樣使用命名空間的成員非常煩瑣,我們需要使用一些其他的更簡(jiǎn)便的方法。
1、命名空間的別名
有些命名空間的名字很長(zhǎng)或者命名空間嵌套了很多層,我們可以為其設(shè)定一個(gè)較短的同義詞,也就是別名:
namespace cln = cpluslus_learning_namespace; namespace Qlib = outer::inner::QueryLib;
2、using聲明
一條using聲明(using declaration)語(yǔ)句一次只引入命名空間的一個(gè)成員:
using 命名空間名::[命名空間名::……]成員名; // 例如 using OLib::List;
3、using指示
using指示(using directive)和using聲明不同的地方是,我們無(wú)法控制哪些名字是可見(jiàn)的,因?yàn)閡sing指示會(huì)使得某個(gè)特定的命名空間中所有的名字都可見(jiàn):
using namespace std; // 引入命名空間std
使用命名空間主要是為了防止名字沖突,如果隨意使用using指示注入命名空間的所有名字,將重新引入名字沖突的問(wèn)題。另外,using聲明和using指示在作用域上有區(qū)別:using聲明是將一個(gè)成員引入當(dāng)前命名空間作用域內(nèi);using指示是將所有成員引入當(dāng)前和上一層命名空間作用域內(nèi):
namespace nsp { // 命名空間 int i=16, j=15; } int j = 0; // 全局變量 int main() { using namespace nsp; // 如果使用j,將在::j和nsp::j之間產(chǎn)生沖突 std::cout << j; return 0; }
如果將using namespace nsp;改成using聲明using nsp::j;則會(huì)正確輸出15。
上一篇:C++多重繼承與虛繼承分析
欄 目:C語(yǔ)言
下一篇:VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例
本文標(biāo)題:C++命名空間實(shí)例解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3503.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類(lèi)算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改