溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++ 名稱空間以及其特性是什么

發(fā)布時(shí)間:2021-09-24 16:40:24 來(lái)源:億速云 閱讀:130 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

本篇文章為大家展示了C++ 名稱空間以及其特性是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

一、傳統(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)開(kāi)始,到其聲明區(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
}

名稱空間是開(kāi)放的(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
}

上述內(nèi)容就是C++ 名稱空間以及其特性是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI