1. 程式人生 > >C++程式設計思想筆記--第十章 名字控制

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

一、前言

建立名字是程式設計過程中的一項最基本的活動,當專案很大時,它會不可避免的包含大量的名字。c++允許我們對名字的產生和名字的可見性進行控制,包括名字·的儲存位置和名字的連線。 本章主要介紹,static控制儲存和可見性,以及通過名字空間來控制訪問名字的改進方法。

二、static控制名字的儲存和可見性

static的兩個基本含義: 1.物件會在靜態資料區上建立,而不是每次函式呼叫時在堆疊上產生。(靜態資料區:靜態變數和全域性變數存放在同一個儲存區域,在程式結束後由系統釋放。) 2.static控制名字的可見性,在這個名字的單元或類之外時不可見的。

2.1函式內部的靜態變數

在函式內部定義區域性變數時,每次呼叫函式時,都會使堆疊的指標向下移動一個適當的位置為這些區域性變數分配記憶體。 如果需要在函式兩次呼叫的時候保留變數的值,又要保證這個變數只受這個函式控制,就可以在函式內部定義static物件。(如果使用全域性變數,對於其它的函式,這個變數是可見的)這個變數會儲存在靜態資料區,而不是在堆疊中。只在第一次呼叫時初始化。

2.2控制連線

外部連線:在檔案作用域內的所有名字(即不巢狀在類和函式內部的名字)對程式中所有的翻譯單元都是可見的。全域性變數和普通函式都是外部連結。 內部連線:僅在檔案內部是可見的,檔案之外的函式不能看到或訪問,這個變數也不會和外部的識別符號產生衝突(被宣告為static的物件或函式名字對翻譯單元是侷限於該單元的)

2.3其它儲存說明符

auto:指編譯器自動為該變數分配儲存空間的方法(告訴編譯器這是一個區域性變數) register:也是一個區域性變數,告訴編譯器這個變數會經常用到,所以儘可能的放在暫存器中

三、名字空間

C++通過名字空間namespace,把全域性名字空間分成多個可管理的小空間 1.namespace只能在全域性範圍內定義,但它們之間可以相互巢狀, 2.可以按類語法定義namespace,定義的內容可以在多個檔案中延續,就好像重複定義這個namespace 3.一個namespace可以用另一個名字作為它的別名 4.不能像類一樣去建立名字空間的例項 5.每個翻譯單元可以包含一個沒有命名的名字空間,自動變成內部連線

四、類中的靜態成員

類的靜態成員擁有一塊單獨的儲存區,而不管建立了多少個該類的物件。所有物件的靜態資料成員共享這一塊靜態儲存區。 1.靜態資料成員的定義 如果一個靜態資料成員被宣告,但沒有定義時,聯結器會報錯。定義必須出現在類的外部,而且只能定義一次(不允許內聯)。靜態常量可以在類內提供定義 2.靜態成員函式 靜態成員函式可以不需要任何物件自我呼叫,不能訪問一般資料成員,只能訪問靜態資料成員,也只能呼叫其它靜態資料成員 沒有傳遞this指標,所以不能訪問非靜態的資料成員,也不能呼叫非靜態的成員函式

五、C++中使用C的庫

如果要使用C的函式如下

float f(int a,char b)

C++編譯器會將名字變成_f_int_char之類的,以支援函式過載,但在c中它的內部名就是_f,這樣聯結器將無法解釋f。 可以使用連線替代說明,

extern "C" float f(int a,char b)