namespace名字空間小解

2021-04-08 22:03:26 字數 2975 閱讀 7390

一、標準名字空間的理解:

using namespace std;就是標準名字空間的引用,std是c++標準庫中的名字空間名稱。大家都知道,當我們定義了乙個類,而宣告物件的時候就要用到 class_name 後跟物件名稱,標準名字空間也是這個用法。

其實,我們可以按照乙個更為抽象包含更廣的類來理解標準名字空間。#include中的iostream正是包含在這個標準名字空間裡面的乙個「物件」。

namespace是為了解決c++中的名字衝突而引入的。什麼是名字衝突呢?比如,在檔案x.h中有個類myclass, 在檔案y.h中也有個類myclass,而在檔案z.cpp中要同時引用x.h和y.h檔案。顯然,按通常的方法是行不能的,那怎麼辦呢?引入namespace即可。

標準名字空間的用法:

我們完全可以定義自己的標準名字空間,如下例:

在x.h中的內容為  

//  x.h  

namespace  mynamespace1  

;  };  

在y.h中的內容為  

//  y.h  

namespace  mynamespace2  

; };  

然後在z.cpp中引入x.h和y.h  

//  z.cpp  

#include  "x.h"    

#include  "y.h"

using namespace mynamespace1;

using namespace mynamespace2;  

void  main()  

名字空間實質上是乙個作用域。前面所述,資料成員要包含在類裡面,那麼做為乙個作用域更大的類,要宣告的話,根據需要,一般的類就可以放到標準名字空間裡面。

那麼,當我們宣告了乙個自己的標準名字空間之後,是否還可以新增包含更多的類呢?

答案是肯定的,當我們需要的時候,我們還可以按照原來的格式新增,這樣,再引用的時候,在定義的標準名字空間裡面就包含了所有新增的類。

二、

關於名字空間定義

全域性實體(global entity)

全域性名字空間汙染(global namespace pollution)

1、名字空間定義

namespace 開頭,後面是名字空間的名字。

namespace cplusplus_primer ;

void inverse(matrix &);

matrix operator+(const matrix &m1,matrix &m2)

const double pi = 3.1416;}

在名字空間cplusplus_primer中宣告的類的名字是

cplusplus_primer::matrix

函式的名字是

cplusplus_primer::inverse()

常量的名字是

cplusplus_primer::pi

類,函式,常量被宣告它的名字空間的名字限定修飾:

這些名字被成為限定修飾符(qualified name)

名字空間的定義不一定是連續的.例如

namespace cplusplus_primer

const double pi = 3.1416; }

namespace cplusplus_primer}

名字空間的定義可是非連續的,這對生成乙個庫很有幫助,它使我們更容易將庫的源**組織成

介面和實現部分。

2、域操作符

::使用者宣告的名字空間成員名自動被加上字首,名字空間名後面加上域操作符(::),名字空間成員名

由該名字空間名進行限定修飾。

名字空間成員的宣告被隱藏在其名字空間中,除非我們為編譯器指定查詢的宣告的名字空間,否則

編譯器將在當前域及巢狀包含當前域的域中查詢該名字的宣告。

注意!!!

域操作符也可以被用來引用全域性名字空間的成員。因為全域性名字空間沒有名字。

::member_name

指的是全域性名字空間的成員。

#include

const int max = 65000;

const int linelength = 12;

void fibonacci(int max)}

3 、巢狀名字空間

。。。。。

4 使用名字空間成員

使用限定修飾的名字形式namespace_name::member_name來引用名字空間,毫無疑問是非常麻煩的。

using 宣告,using指示符

5 名字空間別名

namespace international_business_machines

namespace ibm = international_business_machines;

6、 using宣告

namespace cplusplus_primer ;}

}

using cplusplus::matrixlib::matrix;

using 宣告引入的名字有以下特性:

1> 它在該域中必須唯一。

2> 由外圍域中宣告引入的相同名字被其隱藏。

3> 它被巢狀域中的相同名字的宣告隱藏。

namespace blip

int bj = 0;

void mainip()

int wronginit = bk; //錯誤:bk在這裡不可見

7、 using 指示符

namespace blip

int bj = 0;

void mainip()

當我們把乙個應用程式移植到乙個包裝在名字空間中的新版本時,using指示符非常

有用,但是使用多個using指示符會引起全域性名字空間汙染問題。

用多個選擇性的using宣告來代替using指示符會使這個問題最小化,由多個using

宣告引起的二義性的錯誤在宣告點就能被檢測到,因此建議使用using宣告而不是

using指示符,以便更好地控制程式中地全域性名字空間汙染問題。

namespace 名字空間

namespace 中文意思是命名空間或者叫名字空間,傳統的 c 只有乙個全域性的 namespace 但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace...

namespace名字空間

考慮一種情況,當我們有兩個同名的人,zara,在同乙個班裡。當我們需要對它們進行區分我們必須使用一些額外的資訊和它們的名字,比如這個區域,如果它們生活在不同的區域或者它們的母親或父親的名字,等等。在您的c 應用程式中也會出現同樣的情況。例如,您可能正在編寫一些具有名為xyz 函式的 並且還有另乙個可...

HDFS名字空間(NameSpace)

目標 掌握什麼是 名字空間 hdfs 支援傳統的層次型檔案組織結構。使用者或者應用程式可以建立目錄,然後將檔案儲存在這些目錄裡。檔案系統名字空間的層次結構和大多數現有的檔案系統類似 使用者可以建立 刪除 移動或重新命名檔案。namenode 負責維護檔案系統的名字空間,任何對檔案系統名字空間或屬性的...