C++ 名稱空間詳情
一、傳統(tǒng)的C++命名空間
聲明區(qū)域(declaration region): 聲明區(qū)域是可以在其中進(jìn)行聲明的區(qū)域。例如,可以在函數(shù)外面聲明全局變量,對(duì)于這種變量,那么它的聲明區(qū)域?yàn)槠渎暶魉诘奈募?。?duì)于在函數(shù)中聲明的變量,聲明區(qū)域?yàn)槠渎暶魉诘拇a塊。
潛在作用域(potential scope): 變量的潛在作用域從聲明點(diǎn)開始,到其聲明區(qū)域的結(jié)尾。因此潛在作用域比聲明區(qū)域小,這是由于變量在定義之后才能使用。
二、新的命名空間特性
C++包含了一種功能,即通過(guò)定義一種新的聲明區(qū)域來(lái)創(chuàng)建命名的名稱空間,這樣做的目的之一是提供一個(gè)聲明名稱的區(qū)域。一個(gè)名稱空間中的名稱不會(huì)與另外一個(gè)名稱空間的相同名稱發(fā)生沖突,同時(shí)允許程序其他部分使用該名稱空間中聲明的東西。 例如,使用關(guān)鍵字namespace創(chuàng)建兩個(gè)名稱空間:
namespace Jack {
double pail; // variable declaration
void fetch(); // function prototype
int pal; // variable declaration
struct Well {...} // structure declaration
}
namespace Jill {
double bucket(double n) {...}; // variable declaration
double fetch; // variable declaration
int pal; // variable declaration
struct Hill {...} // structure declaration
}
名稱空間是開放的(open),即可以把名稱加到已有的名稱空間中。例如,下面這條語(yǔ)句將名稱goose添加到Jill中已有的名稱列表中:
namespace Jill {
char* goose(const char*);
}
同樣,原來(lái)的Jack名稱空間為fech()函數(shù)提供了原型??梢栽谠撐募竺妫ɑ蛘吡硪粋€(gè)文件中)再次使用Jack名稱空間來(lái)提供函數(shù)的代碼:
namespace Jack {
void fetch() {
...
}
}
需要訪問(wèn)給定名稱空間的名稱時(shí),通過(guò)作用域解析運(yùn)算符::,使用名稱空間來(lái)限定該名稱。
1.using聲明和using編譯指令
當(dāng)我們不希望每次使用名稱時(shí)都對(duì)它進(jìn)行限定,因此c++提供了兩種機(jī)制(using聲明和using編譯指令)來(lái)簡(jiǎn)化對(duì)名稱空間中名稱的使用。
using聲明:使特定聲明的標(biāo)識(shí)符可用
namespace Jill {
double bucket(double n) { ... }
double fetch;
}
char fetch;
int main() {
using Jill::fetch // using declaration
double fetch; // Error! Already have a local fetch
cin >> fetch; // read a value into Jill::fetch
cin >> ::fetch; // read a value into global fetch
}
這段代碼,using聲明將特定的名稱添加到它所屬的聲明區(qū)域中。main()中的using聲明將fetch添加到main()定義的聲明區(qū)域中。完成聲明后,便可以使用名稱fetch代替Jill::fetch。
using編譯指令:使整個(gè)名稱空間可用
using編譯指令使所有的名稱都可用。在全局聲明區(qū)域中使用using編譯指令,將使該名稱空間的名稱全局可用。例如:
#include <iostream>
using namespace std;
// 在函數(shù)中使用using編譯指令,將使其中的名稱在函數(shù)中可用
int main() {
using namespace jack; // make names available in vorn()
}
不同的命名空間表示不同的內(nèi)存單元,以下情況會(huì)存在二義性問(wèn)題,使用時(shí)應(yīng)該注意。
using namespace jack using namespace jill // 二者空間中都有pal變量 pal = 4; // which one? now have a conflict
一般來(lái)說(shuō),使用using聲明比使用using編譯指令更安全,這是由于它只導(dǎo)入指定的名稱。如果該名稱與局部名稱發(fā)生沖突,編譯器會(huì)發(fā)出指示。using編譯指令導(dǎo)入所有名稱,包括一些實(shí)際并不需要的。如果與局部名稱發(fā)生沖突,局部覆蓋名稱空間的版本,而編譯器不會(huì)發(fā)出警告。
2.名稱空間的其他特性
名稱空間可以嵌套
namespace elements {
namespace fire {
int flame;
...
}
float water;
}
訪問(wèn)flame指的是elements::fire::flame,同樣也可以使用using編譯指令使內(nèi)部的名稱可用:using elements::fire
在名稱空間中使用using編譯指令和using聲明,如下:
namespace myth {
using Jill::fetch;
using namespace elements;
using std::count;
}
如果要訪問(wèn)Jill::fetch,以下兩種方式均可訪問(wèn)它。
myth::fetch Jill::fetch
名稱空間的傳遞性
using編譯指令是可以傳遞的。如果A op B且B op C,則A op C。
using namespace myth; /// 以上和下面兩句等價(jià) using namespace myth; using namespace elements; // 給命名空間創(chuàng)建別名 namespace MEF = myth::elements::fire; using MEF::flame;
未命名的名稱空間
往往是靜態(tài)變量的替代品。
static int counts //全局聲明 static storage, internal linkage
/// 等價(jià)于
namespace {
int counts // static storage, internal linkage
}
到此這篇關(guān)于C++ 名稱空間詳情的文章就介紹到這了,更多相關(guān)C++ 名稱空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之二叉查找樹
這篇文章主要介紹了C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之二叉查找樹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
ubuntu 下編譯C++代碼出現(xiàn)的問(wèn)題解決
這篇文章主要介紹了ubuntu 下編譯C++代碼出現(xiàn)的問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2015-03-03
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的12306火車售票系統(tǒng)
火車售票系統(tǒng)給我們的出行帶來(lái)了極大的方面,那么他基于編程是如何實(shí)現(xiàn)的呢?今天小編抽時(shí)間給大家分享一個(gè)使用C語(yǔ)言寫的一個(gè)簡(jiǎn)單的火車票系統(tǒng),感興趣的朋友參考下2016-09-09
C++控制權(quán)限關(guān)鍵字protected
這篇文章主要介紹了C++控制權(quán)限關(guān)鍵字protected,protected和private類似,而對(duì)于派生類來(lái)說(shuō),protected與public類似,下面來(lái)一起倆姐更多詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下2022-01-01
基于Matlab圖像處理的公路裂縫檢測(cè)實(shí)現(xiàn)
隨著公路的大量投運(yùn),公路日常養(yǎng)護(hù)和管理已經(jīng)成為制約公路運(yùn)營(yíng)水平提高的瓶頸,特別是路面狀態(tài)采集、檢測(cè)維護(hù)等工作更是對(duì)傳統(tǒng)的公路運(yùn)維模式提出了挑戰(zhàn)。這篇文章主要介紹了如何通過(guò)Matlab圖像處理實(shí)現(xiàn)公路裂縫檢測(cè),感興趣的可以了解一下2022-02-02
C++中給二維指針?lè)峙鋬?nèi)存(實(shí)現(xiàn)代碼)
我們都知道在 C++ 中分配動(dòng)態(tài)數(shù)組用的是 new , 撤銷動(dòng)態(tài)數(shù)組用的是 delete[ ] ,現(xiàn)在讓我們來(lái)看看怎么利用這兩個(gè)關(guān)鍵字給二維指針?lè)峙鋬?nèi)存2013-10-10

