C Primer 筆記 命名空間

2022-08-19 05:03:10 字數 2558 閱讀 5839

1.我們既可以用 using 宣告整個空間,也可以宣告部分名字。

using

namespace

std;

using std::cout;

2.標頭檔案不應包含 using 宣告,因為標頭檔案會拷貝到所引用它的檔案中去,所以每個使用了該標頭檔案的檔案就都會有這個宣告。

3.命名空間可以是不連續的。

4.模板特例化必須定義在原始模板所屬的命名空間中,和其它命名空間名字類似,只要我們在命名空間中宣告了特例化,就能在命名空間外部定義它了。

namespace

myspace

}template

<>

void myspace::test(const

int &t) {}

5.全域性作用域中定義的名字也就是定義在全域性命名空間中,全域性命名空間以隱式的方式宣告,並且在所有程式中都存在。

int i = 0

;::i;

6.巢狀的命名空間中,內層命名空間宣告的名字將隱藏外層命名空間宣告的同名成員。外層命名空間中無法直接訪問內層中的名字。

7.c++11新標準引入了內聯命名空間,內聯命名空間中的名字可以被外層命名空間直接使用。關鍵字inline必須出現在命名空間第一次定義的地方,後續再開啟命名空間的時候可以寫inline也可以不寫。

namespace

test

int j = i; //

正確}

8.未命名的命名空間中定義的變數擁有靜態生命週期,它們在第一次使用前建立,並且直到程式結束才銷毀。乙個未命名的命名空間可以在某個給定的檔案內部連續,但是不能跨越多個檔案。每個檔案定義自己的未命名的命名空間,而且相互無關。未命名的命名空間中的名字不能與全域性作用域的名字重複,也不能使用作用域運算子。如果未命名的命名空間巢狀在其他命名空間中,則可以被外層直接訪問。

int

i;namespace

i = 0; //

二義性錯誤

::j; //

錯誤

9.乙個命名空間可以有好幾個同義詞或別名,而且互相之間是等價的。

10.一條using宣告語句一次只引入命名空間的乙個成員,可以出現在全域性作用域,區域性作用域,命名空間作用域以及類的作用域中,在類的作用域中,這樣的宣告語句只能指向基類成員。using指示和using宣告類似的地方是,我們可以使用命名空間名字的簡寫形式,不同的是,我們無法控制哪些名字是可見的,因為所以名字都是可見的。using指示也不能出現在類的作用域中。

using std::cout;        //

using 宣告

using

namespace std; //

using 指示

11.通常情況下,命名空間中會含有一些不能出現在區域性作用域中的定義,因此,using指示一般被看作是出現在最近的外層作用域中。但是這也可能會與外層作用域的名字產生衝突,這種衝突時允許存在的。

int

j;namespace

myspace

void

test()

12.實參相關的查詢與類型別形參。

std::string

str;

operator >> (std::cin, str);

上述**中,operator>> 函式定義在標準庫string中,string又定義咋命名空間 std 中。但是我們不用std:: 限定符和using 宣告就可以呼叫operator>>。

原因是,當我們給函式傳遞乙個類型別的物件時,除了在常規的作用域查詢外還會查詢實參類所屬的命名空間。這一例外對於傳遞類的引用或指標的呼叫同樣有效。

13.友元宣告與實參相關的查詢。當類宣告了乙個友元時,該友元宣告並沒有使得友元本身可見。

namespacea;

}int

main()

14.uisng宣告語句宣告的是乙個名字,而非乙個特定的函式,當我們為函式書寫using宣告時,該函式的所有版本都被引入到當前作用域中。如果using宣告出現在區域性作用域中,則引入的名字將隱藏外層作用域的相關宣告,如果using所在的作用域中已經有乙個函式與新引入的函式同名且形參列表相同,將引發錯誤。

namespace

ausing a::test(int); //

錯誤using a::test; //

正確

15.與using宣告不同的是,對於using指示來說,引入乙個與已有函式形參列表完全相同的函式並不會產生錯誤。此時只要我們指明呼叫的是命名空間中的函式版本還是當前作用域的版本即可。

namespacea}

using

a::test;

void test(int) {} //

錯誤

namespacea}

using

namespace

a;void test(int) {} //

正確

《C Primer》讀書筆記 命名空間

我們在寫程式時會用到各種類和函式,這些名字難免會有衝突,尤其是大型專案,更避免不了重名的問題。所以,當有重名的時候,就引入了命名空間的概念。由於這種機制對於宣告於其中的名稱都進行了本地化,就使得相同的名稱可以在不同的上下文中使用,而不會引起名稱的衝突。命名空間就是乙個作用域,我們在使用這個作用域中的...

c primer要點 異常 命名空間 多繼承

1.編譯器使用異常丟擲表示式來對異常物件進行拷貝初始化,該表示式決定了異常物件的型別 進入catch語句後,通過異常物件初始化異常宣告中的引數。2.throw 重新丟擲語句,將當前異常物件沿著呼叫鏈向上傳遞。catch 捕獲所有異常。3.要想處理建構函式初始值丟擲的異常,必須將建構函式寫成函式try...

PHP命名空間筆記

此篇文章作為我從開始學習php到工作一段時間後的命名空間知識點總結,會隨學習和工作的提高而完善 命名空間 定義命名空間意義 一 為了解決多檔案中 相互引入時 類名,常量名,函式名可能會重複命名的問題 二 快速定位檔案位置 三 就是給檔案加個隱式字首 四 命名空間需要寫在檔案的最前面 全域性空間 如果...