雖然很多程式設計師都熟悉名字空間的概念,但他們常常都是被動地使用名字空間。也就是說他們使用的是第三方定義的成員(如標準庫的類和函式),而不是在名字空間中宣告自己的類和函式。本文擬討論如何在名字空間中宣告自己的類和函式,以及如何在程式中使用它們。
名字空間是乙個範疇,它包含類宣告,函式宣告,常量宣告和模板宣告等名字空間成員。例如:
namespace proj_alpha
;void encrypt (char *msg);
const int max_spies = 8;
}在上面的例子中,類
spy在乙個單獨的檔案中實現。通常,你是在乙個專門的標頭檔案中宣告乙個類並在不同的原始檔中獨立地定義其成員函式。那麼如何將名字空間成員類分離成多個原始檔呢?
下面是名為
foo.hpp
的標頭檔案,其中定義了乙個名為
ns的名字空間,它包含類
foo的宣告:
namespace ns
;}//close ns
另外,在乙個單獨的原始檔
foo.cpp
中,首先包含標頭檔案
foo.hpp
以便實現類
foo的成員函式
f()和
g():
#include "foo.hpp"
void ns::foo::f()
void ns::foo::g()
為了使用名字空間成員,必須使用成員的全路徑名,它由名字空間後跟
::合成原名組成。因此,類
foo的全路徑名是
ns::foo
。這樣編譯器便可以知道
ns是乙個名字空間名,標頭檔案
foo.hpp
必須在引用
ns之前被包含。
名字空間是可以擴充套件的。也就是說可以宣告類,而且所宣告的類在其它的
.cpp
檔案中是相同的名字空間成員:
namespace ns //
擴充套件ns;}
在bar.cpp
檔案中:
#include "bar.hpp"
void ns::bar::a()
void ns::bar::b()
可以看出,雖然
foo和
bar這兩個類在不同的標頭檔案中宣告,但它們都是名字空間
ns的成員。並且編譯器和鏈結器將這兩個類看成是同一名字空間的成員。那麼,如何在應用程式中使用這些類呢?
在檔案main.cpp
中,必須要包含宣告類
foo和
bar的標頭檔案並加上相應的名字空間引用宣告
-using
:#include "bar.hpp"
#include "foo.hpp"
int main()
using
宣告由關鍵字
using
後跟名字空間成員的全路徑。這樣就使你在
using
宣告範圍內使用成員時不用再加路徑。上面的例子中,可以直接使用
foo和
bar,因為在
main()
的開始使用了
using
宣告。如果沒有
using
宣告就必須使用全路徑成員名。
int main()
另外,還有一種引用名字空間成員的方法是使用
using
指令:#include "bar.hpp"
#include "foo.hpp"
int main()
using
指令由關鍵字
「using namespace」
後跟名字空間名構成。在訪問名字空間成員時它是使用最少的一種方法,原因是這種方法將所有名字空間成員注入當前的範圍,從而增加了潛在的名字衝突。
<
C 命名空間中類宣告 成員函式宣告和函式模板
namespace proj alpha void encrypt char msg const int max spies 8 在使用c 類的時候,常常會用到命名空間,在使用的時候一般需要前置宣告。例如 spacea header file pragma once namespace testa ...
命名空間中的類和方法
摘要 理解 命名空間相當於乙個國家,類相當於省份,方法相當於市區,但省份之間不可重名,乙個省份下的市區不可重名。每個空間下的省份和市區可以和其他空間下的省份和市區重名。知識點 宣告命名空間 namespace 空間名 獲取當前空間名稱 namespace 引用當前空間 namespace乙個檔案中可...
命名空間中的類和方法
摘要 理解 命名空間相當於乙個國家,類相當於省份,方法相當於市區,但省份之間不可重名,乙個省份下的市區不可重名。每個空間下的省份和市區可以和其他空間下的省份和市區重名。知識點 宣告命名空間 namespace 空間名 獲取當前空間名稱 namespace 引用當前空間 namespace乙個檔案中可...