C 程式設計思想筆記 第十章 名字控制

2021-08-28 04:08:15 字數 1562 閱讀 4864

三、名字空間

四、類中的靜態成員

五、c++中使用c的庫

建立名字是程式設計過程中的一項最基本的活動,當專案很大時,它會不可避免的包含大量的名字。c++允許我們對名字的產生和名字的可見性進行控制,包括名字·的儲存位置和名字的連線。

本章主要介紹,static控制儲存和可見性,以及通過名字空間來控制訪問名字的改進方法。

static的兩個基本含義:

1.物件會在靜態資料區上建立,而不是每次函式呼叫時在堆疊上產生。(靜態資料區:靜態變數和全域性變數存放在同乙個儲存區域,在程式結束後由系統釋放。)

2.static控制名字的可見性,在這個名字的單元或類之外時不可見的。

在函式內部定義區域性變數時,每次呼叫函式時,都會使堆疊的指標向下移動乙個適當的位置為這些區域性變數分配記憶體。

如果需要在函式兩次呼叫的時候保留變數的值,又要保證這個變數只受這個函式控制,就可以在函式內部定義static物件。(如果使用全域性變數,對於其它的函式,這個變數是可見的)這個變數會儲存在靜態資料區,而不是在堆疊中。只在第一次呼叫時初始化。

外部連線:在檔案作用域內的所有名字(即不巢狀在類和函式內部的名字)對程式中所有的翻譯單元都是可見的。全域性變數和普通函式都是外部鏈結。

內部連線:僅在檔案內部是可見的,檔案之外的函式不能看到或訪問,這個變數也不會和外部的識別符號產生衝突(被宣告為static的物件或函式名字對翻譯單元是侷限於該單元的)

auto:指編譯器自動為該變數分配儲存空間的方法(告訴編譯器這是乙個區域性變數)

register:也是乙個區域性變數,告訴編譯器這個變數會經常用到,所以盡可能的放在暫存器中

c++通過名字空間namespace,把全域性名字空間分成多個可管理的小空間

1.namespace只能在全域性範圍內定義,但它們之間可以相互巢狀,

2.可以按類語法定義namespace,定義的內容可以在多個檔案中延續,就好像重複定義這個namespace

3.乙個namespace可以用另乙個名字作為它的別名

4.不能像類一樣去建立名字空間的例項

5.每個翻譯單元可以包含乙個沒有命名的名字空間,自動變成內部連線

類的靜態成員擁有一塊單獨的儲存區,而不管建立了多少個該類的物件。所有物件的靜態資料成員共享這一塊靜態儲存區。

1.靜態資料成員的定義

如果乙個靜態資料成員被宣告,但沒有定義時,聯結器會報錯。定義必須出現在類的外部,而且只能定義一次(不允許內聯)。靜態常量可以在類內提供定義

2.靜態成員函式

靜態成員函式可以不需要任何物件自我呼叫,不能訪問一般資料成員,只能訪問靜態資料成員,也只能呼叫其它靜態資料成員

沒有傳遞this指標,所以不能訪問非靜態的資料成員,也不能呼叫非靜態的成員函式

如果要使用c的函式如下

float f(int a,char b)
c++編譯器會將名字變成_f_int_char之類的,以支援函式過載,但在c中它的內部名就是_f,這樣聯結器將無法解釋f。

可以使用連線替代說明,

extern

"c"float f(int a,char b)

C 程式設計思想學習筆記 第十章 名字控制

第十章 名字控制 10.1 來自c語言中的靜態元素 在c和c 的定義中,static都有兩種基本含義 1 在固定的位址上進行儲存分配,物件在靜態區建立,而不是每次呼叫函式時在堆疊上產生。生存期 在每次進入定義該變數的函式時 2 如果static變數是定義在某個檔案中,不在任何函式內,則它在該檔案中是...

第十章 名字控制

在c和c 中,static都有兩種基本的含義。1 在固定的位址上進行儲存分配。也就是說物件是在乙個特殊的靜態資料區上建立的,而不是每次函式呼叫時在堆疊上產生的。這也是靜態儲存的概念。2 對乙個特定的編譯單位來說是區域性的。這樣,static控制名字的可見性,所以這個名字在這個單元或者類之外是不可見的...

Java程式設計思想筆記 第十章

1 可以將乙個類的定義放在另乙個類的定義內部,這就是內部類。2 如果想從外部類的非靜態方法之外的任意位置建立某個內部類的物件,那麼必須顯式的指明這個物件的型別 outerclassname.innerclassname。3 內部類擁有其外部類的所有元素的訪問權。4 如果在內部類中需要生成對於外部類的...