首頁 > 軟體

C++中的名稱空間詳細介紹

2022-02-13 10:00:21

名稱空間的特性

首先熟悉一下名稱空間的兩個概念。

宣告區域:可以在其中進行宣告的區域,如全域性檔案的宣告區域是檔案,函數內宣告的變數宣告區域為程式碼塊。潛在作用域:潛在作用域從宣告點開始,到其宣告區域的結尾。因此潛在作用域比宣告區域小,因為變了必須定義後才能使用。
這兩個概念通過下圖很好理解,也是程式設計的常識。

宣告名稱空間和名稱空間成員

可以使用如下語法宣告名稱空間和空間成員

namespace Jack {
	double a;
	struct b {};
	void f();
}

全域性名稱空間

如果未在顯式名稱空間中宣告某個識別符號,則該識別符號屬於隱式全域性名稱空間的一部分。 一般情況下,嘗試避免在全域性範圍內進行宣告(入口點 Main 函數除外,它必須位於全域性名稱空間中)。
全域性名稱空間可以是用 ::var 來呼叫。

不連續名稱空間

即同一個名稱空間可以在多個檔案中定義,如
file1.cpp

namesapce A {
	int a;
}

file2.cpp

namesapce A {
	int b;
}

在編譯時會將分散在各個檔案中的同一個名稱空間集合在一起。

巢狀名稱空間

名稱空間也是可以巢狀的

namespace A {
	namespace B {}
}

using宣告和using編譯指令

using宣告將特定的名稱新增到它所屬的宣告區域中,例如using A::a;,相當於 Java 中的靜態匯入,而using 編譯指令使名稱空間的所有名稱都可以用,而不需要使用作用於解析符,如 using namespace std;,作用相當於 Java 中的。import java.util.*。這裡記錄一下注意點。

using A::pal;
using B::pal; // error declaration conflict
pal = 4;

上述程式碼會引起衝突。
一般而言使用using宣告會更安全點。

名稱空間別名

名稱空間名稱必須是唯一的,這意味著通常它們不應太短。 如果名稱的長度使程式碼難以讀取,或在不能使用 using 指令的檔頭檔案中鍵入枯燥,則可以建立一個名稱空間別名作為實際名稱的縮寫。 例如:

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

總結

到此這篇關於C++中的名稱空間詳細介紹的文章就介紹到這了,更多相關C++名稱空間內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com