C Primer第9章相關問題及總結

2021-10-02 03:35:52 字數 2299 閱讀 1045

如果檔名包含在雙引號中,則編譯器將首先查詢當前的工作目錄或源**目錄(或其他目錄,這取決於編譯器),如果沒有在那裡找到標頭檔案,則將會在標準位置查詢,因此在包含自己的標頭檔案時,應使用引號而不是尖括號。

在**塊定義的變數,它的生命即該變數的存在時間和作用域將被限制在該**塊中,這種就是區域性變數。

當兩個變數的名稱相同時,當程式執行到**塊時,**塊中的那個變數——區域性變數將會覆蓋全域性變數。當程式流程離開**塊時,區域性變數過期,此時全域性變數將再次可見。

其實函式呼叫的值在函式結束的時候,這些值並沒有被刪除,但不在被標記,它們佔據的空間將被下乙個將值加入到棧中的函式呼叫所使用。

靜態外鏈不初始化預設值為0.

加了extern關鍵字的變數名不初始化為宣告,系統不會重新為它分配記憶體空間,該檔案的程式使用另外乙個檔案定義的同名變數占用的空間,有點類似於引用。

而不加extern關鍵字的變數如常規變數,不管初不初始化,系統都會為它分配記憶體空間。

將static限定符用於作用域為整個檔案的變數時,該變數的鏈結性將為內部的。因此意味著該變數只能在定義的它的檔案中使用。

定義在**塊中的static變數,被稱為無鏈結性的靜態變數,這意味著該變數只能在該**塊中可用,但是它和自動持續變數不同的是,自動持續變數在函式結束時,系統自動釋放它們的記憶體空間,但是無鏈結性的靜態變數是一直存在的。

放在變數名前面時,該運算子表示使用變數的全域性版本。

using 宣告:

using jill::a; //相當於在本區域內定義變數

using編譯指令:

using namespace jill; //雖然在本區域定義,但卻在全域性起作用

#include

using

namespace std;

namespace jill

intmain()

但是

#include

using

namespace std;

namespace jill

using jill::fetch;

//將jill::fetch變為全域性變數

intmain()

此時輸出的結果就是2,說明區域性變數覆蓋了全域性變數

但是!

#include

using

namespace std;

namespace jill

using jill::fetch;

//將jill::fetch變為全域性變數

intmain()

此時輸出的結果就是jill命名空間中的fetch的值1。

#include

using

namespace std;

namespace jill

intmain()

這裡輸出結果為4,函式修改了命名空間中fetch的值,將其修改為4.

那麼將using編譯命令提到函式之外又會怎麼樣呢?

#include

using

namespace std;

namespace jill

using

namespace jill;

intmain

(int argc,

char

*ar**)

此時的輸出結果為3,因為區域性變數覆蓋了全域性變數。

注意:使用using編譯指令匯入乙個命名空間中所有的名稱與使用多個using宣告是不一樣的,而更像是大量使用作用域解析操作符。

使用using宣告時,就好像宣告了相應的名稱一樣。如果某個名稱已經在函式中宣告了,則不能使用using宣告匯入相同的名稱。

在上面的例子中,命名空間為全域性的.如果使用using編譯指令匯入乙個已經在函式中宣告的名稱,則區域性名稱將隱藏命名空間名,

(書上就這樣模糊)

記住:1.假設命名空間和宣告區域定義了相同的名稱。如果試圖使用using宣告將命名空間的名稱匯入該宣告區域,則這兩個名稱會發生衝突,從而出錯。如果使用using編譯指令將該命名空間的名稱匯入該宣告區域,則區域性版本將隱藏命名空間版本。

2.一般來說,使用using宣告比使用using編譯指令更安全,這是由於它只匯入指定的名稱。如果該名稱與區域性名稱發生衝突,編譯器將付出指示。using編譯指令匯入所有名稱,包括可能並不需要的名稱。如果與區域性名稱發生衝突,則區域性名稱將覆蓋命名空間版本,而編譯器並不會發出警告,另外,命名空間的開放性意味著命名空間的名稱可能分散在多個地方,這使得難以準確的知道新增了哪些名稱。

C Primer 第9章筆記

9.1 順序容器概述 順序容器型別 forward list沒有size操作。9.2 容器庫概覽 一般來說,每個容器都定義在乙個與型別名相同的標頭檔案中,容器均定義為模板類。對容器可以儲存的元素型別的限制 如沒有預設建構函式的物件。容器操作 型別別名 建構函式 賦值與swap 大小 新增 刪除元素 ...

C Primer 第9章 習題9 32

9.32 解釋下面程式的實現的功能 vectorsvec svec.reserve 1024 string text word while cin text word sevc.push back text word svec.resize svec.size svec.size 2 如果該程式讀入...

C Primer 第9章 習題9 32

9.32 解釋下面程式的實現的功能 vectorsvec svec.reserve 1024 string text word while cin text word sevc.push back text word svec.resize svec.size svec.size 2 如果該程式讀入...