跳到正文

Wiki

名稱空間

約 2 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.名稱空間與名稱衝突

在 C++ 應用程式中。例如,您可能會寫一個名為 xyz() 的函式,在另一個可用的庫中也存在一個相同的函式 xyz()。這樣,編譯器就無法判斷您所使用的是哪一個 xyz() 函式。

因此,引入了 名稱空間 這個概念,專門用於解決上面的問題,它可作為附加資訊來區分不同庫中相同名稱的函式、類、變數等。使用了名稱空間即定義了上下文。本質上,名稱空間就是定義了一個範圍。

1.1.定義名稱空間

名稱空間的定義使用關鍵字 namespace ,後跟名稱空間的名稱,如下所示:

namespace namespace_name {
   // 代码声明
}

執行結果: 此程式碼塊不含 main 函式,是語法、介面或分檔案示例,不能獨立執行,因此沒有終端輸出。

為了呼叫帶有名稱空間的函式或變數,需要在前面加上名稱空間的名稱,如下所示:

name::code;  // code 可以是变量或函数

執行結果: 此程式碼塊不含 main 函式,是語法、介面或分檔案示例,不能獨立執行,因此沒有終端輸出。

1.2.using 指令

您可以使用 using namespace 指令,這樣在使用名稱空間時就可以不用在前面加上名稱空間的名稱。這個指令會告訴編譯器,後續的程式碼將使用指定的名稱空間中的名稱。

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}

// 第三个命名空间
namespace third_space{
   void func()
   {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
using second_space::func;    //(与25行代码建议不能共存,因为都导入了func()函数),(这种方法更好更推荐)

int main ()
{

   // 调用第一个命名空间中的函数
   func();
   // 调用第二个命名空间中的函数   
   func();         //(与32行代码不能共存)
   //调用第三个命名空间中的函数
   third_space::func();

   return 0;
}

執行結果: 編譯失敗:using namespace 把兩個同名 func() 同時引入當前作用域,呼叫 func() 時產生二義性。

1.3.巢狀的名稱空間

名稱空間可以巢狀,您可以在一個名稱空間中定義另一個名稱空間,如下所示:

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

執行結果: 此程式碼塊不含 main 函式,是語法、介面或分檔案示例,不能獨立執行,因此沒有終端輸出。

您可以通過使用 :: 運算子來訪問巢狀的名稱空間中的成員:

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;

// 访问 namespace_name1 中的成员
using namespace namespace_name1;

執行結果: 此程式碼塊不含 main 函式,是語法、介面或分檔案示例,不能獨立執行,因此沒有終端輸出。