c++中經常會使用到namespace關鍵字,那麼到底什麼是namespace呢?它有什麼用呢?
namespace直譯就是命名空間的意思,它是一種邏輯分組機制,將按照某些標準在邏輯上屬於同乙個任務的所有類宣告放在同乙個命名空間。最常用到的using namespace std就是在標準c++中所有包含的內容(包括常量,變數,結構,類和函式等)都被定義在命名空間std中了。
命名空間的格式為:
有名的命名空間:
namespace 命名空間名
無名的命名空間:
namespace
命名空間的成員,是在命名空間定義中的花括號內宣告了名稱。可以在命名空間的定義內,定義命名空間的成員(內部定義)。也可以只在命名空間的定義內宣告成員,而在命名空間的定義之外,定義命名空間的成員(外部定義)。
命名空間成員的外部定義的格式為:
命名空間名::成員名 ……
例如:// out.h
namespace outer // 命名空間inner的成員f()的內部定義,其中的i為outer::i
int i;
void g() // 命名空間inner的成員g()的內部定義,其中的i為inner::i
void h(); // 命名空間inner的成員h()的宣告 }
void f(); // 命名空間outer的成員f()的宣告
// namespace inner2; // 錯誤,不能宣告子命名空間 }
void outer::f() // 命名空間outer的成員f()的外部定義
void outer::inner::h() // 命名空間inner的成員h()的外部定義
// namespace outer::inner2 {} // 錯誤,不能在外部定義子命名空間
注意:不能在命名空間的定義中宣告(另乙個巢狀的)子命名空間,只能在命名空間的定義中定義子命名空間。
也不能直接使用「命名空間名::成員名 ……」定義方式,為命名空間新增新成員,而必須先在命名空間的定義中新增新成員的宣告。另外,命名空間是開放的,即可以隨時把新的成員名稱加入到已有的命名空間之中去。方法是,多次宣告和 定義同一命名空間,每次新增自己的新成員和名稱。例如:
namespace a // 現在a有成員i和f()
namespace a // 現在a有成員i、f()、j和g()
還可以用多種方法,來組合現有的命名空間,讓它們為我所用。例如:
namespace my_lib ……
using namespace my_lib; ……
vectorvs[5];
listli[10];
my_f(vs[2], li[5]);
使用命名空間
作用域解析運算子(::)
對命名空間中成員的引用,需要使用命名空間的作用域解析運算子::。例如:
// out1.cpp
#include "out.h"
#include
int main ( ) using指令(using namespace)
為了省去每次呼叫inner成員和標準庫的函式和物件時,都要新增outer::inner::和 sta::的麻煩,可以使用標準c++的using編譯指令來簡化對命名空間中的名稱的使用。格式為:
using namespace 命名空間名[::命名空間名……];
在這條語句之後,就可以直接使用該命名空間中的識別符號,而不必寫前面的命名空間定位部分。因為 using指令,使所指定的整個命名空間中的所有成員都直接可用。例如:
// out2.cpp
#include "out.h"
#include
// using namespace outer; // 編譯錯誤,因為變數i和函式f()有名稱衝突
using namespace outer::inner;
using namespace std;
int main ( )
c 的namespace使用經驗
這幾天剛開始看c 其namespace部分困住了我一會,經過多處查詢資料,終於弄明白,現將經驗整理如下 比如我在 namespace n1 裡建乙個類a,裡面有幾個方法,然後在 ns2.cs裡引用n1,並且呼叫其中的方法。簡單 如下 ns1.cs using system namespace n1 ...
C 中的全域性namespace
我們應該知道傳統的c 只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace引入了複雜性,解決了這個問題。namespac...
C 中namespace的用法
c 語言提供乙個全域性的命名空間namespace,可以避免導致全域性命名衝突問題。舉乙個例項,請注意以下兩個標頭檔案 one.h char func char class string somelib.h class string 如果按照上述方式定義,那麼這兩個標頭檔案不可能包含在同乙個程式中,...