玩轉C 名字空間

2021-06-08 17:32:20 字數 3183 閱讀 1114

一、概要

名字空間是一種描述邏輯分組的機制。也就是說,如果有一些宣告按照某種準則在邏輯上屬於同乙個集團,就可以將它們放入同乙個名字空間,以表明這個事實。名字空間就是為了表示邏輯結構。同時也避免了名字衝突。

名字空間的宣告和定義:

namespace namespace-name

ps:只有名字空間的宣告定義與函式的定義後是不用分號;的,其餘的都是要帶分號的。

二、使用宣告和使用指令

int main()

如果像上面那樣寫,很令人厭煩。有兩種方式可以解決這種煩惱。

(1)使用宣告:

int main()

使用宣告,可以宣告你想要的東西。

(2)使用指令

int main()

使用指令,則把該名字空間下的所有名字都變成可用的。 

全域性性的使用指令是一種完成轉變的工具,在其他方面最好避免使用。在乙個名字空間裡的使用指令是一種名字空間的組合工具。在乙個函式裡可以安全地講使用指令作為一種方便的記法方式。

三、名字空間的組合

namespace stack    //在其他地方實現。

namespace employee

void insert(char *name)

char* get_employee()

}

名字空間的組合也是一種設計,設計理念類似於類的組合。

四、多重介面

多重介面可以提供給使用者不同的藉口,而使用者不用關心其底層是怎麼實現的。

例子:str1.h

#ifndef str1_h_included

#define str1_h_included

namespace my_string

#endif // str1_h_included

str2.h

#ifndef str2_h_included

#define str2_h_included

namespace my_string

#endif // str2_h_included

實現:strimpl.cpp

#include "str1.h"

#include namespace my_string

void my_string::init()

int my_string::length()

void my_string::print_string()

void my_string::set_string(char *data)

str1.h和str2.h使用的都是my_string的名字空間,但提供給外界的介面是不一樣的。

測試:

#include #include "str1.h"    //包含的是str1

using namespace std;

int main()

#include #include "str2.h"

using namespace std;

int main()

五、無名名字空間與名字空間別名

有時,將一組宣告包裹在乙個名字空間裡就是為了避免可能的名字衝突。這樣做的目的只是保持**的區域性性,而不是為使用者提供介面。

noname.h

namespace ;

}void g()

無名名字空間有乙個隱含的使用指令的。上面的**相當於。

namespace $$$;

}using namespace $$$;

void g()

但不能在noname.h之外使用到這個無名名字空間裡的東西了。例如:

#include "noname.h"

void h()

如果名字空間的名字太長,我們可以給他取個別名。

例如:

namespace someone_union_**** 

namespace someone = someone_union_****;

someone::**** = "hello";

六、組合與選擇

namespace his_lib 

void g()

}namespace her_lib

void g()

}namespace my_lib

}

七、名字空間與過載,以及其開放性。

過載可以跨名字空間工作的。

namespace his_lib 

}namespace her_lib

}namespace my_lib

}

名字空間是開放的。乙個名字空間的定義可以分布到多個標頭檔案和源**檔案裡。名字空間的開放性使我們可以通過展示名字空間不同部分的方式,為不同種類的使用者提供不同的介面。

head1.h

namespace his_lib

head2.h

namespace his_lib

如果你只是向在檔案裡實現原先名字空間中已經宣告的函式,則最好在此之前用名字空間的名字去修飾使用his_lib::的方式。

#include "head1.h"

namespace his_lib //編譯錯誤,his_lib沒有宣告這個。

void ff() {} //編譯通過,在名字空間his_lib中引用了新的ff函式

}

總結:

乙個名字空間應該:

[1]描述了乙個具有邏輯統一性的特徵集合。

[2]不為使用者提供對無關特徵的訪問,使用封裝。

[3]不給使用者強加任何明顯的記述負擔。

參考書籍《c++程式語言》

C 名字空間

namespace 名字空間名 注 名字空間成員可以是全域性變數 全域性函式 型別 名字空間 作用域限定操作符 名字空間名 要訪問的成員 include namespace nm1 namespace nm2 intmain 當名字沒有重複的時候,我們可以簡化 方法一 名字空間指令 格式 using...

c 名字空間指令與名字空間宣告

在使用任何名字空間之前,編譯器必須能夠找到他,即確定他的宣告所在的作用域。使用某個名字空間中的名字最簡單的方式就是使用限定名字,即把名字空間的名字 如ns1 作為字首,然後加上作用域操作符 然而又是可能不願使用名字空間以追求 簡潔。可以通過下面實現 1.使用using指令 如 using names...

C 的名字空間

1 名字空間的作用 1 避免名字衝突 2 劃分邏輯單元 2 定義名字空間 namespace 名字空間 struct student namespace ns2 3 名字空間成員的使用 1 通過作用域限定操作 空間成員 要訪問的成員 eg int main void 02namespace.cpp ...