const,static,extern用法總結

2021-07-15 16:05:16 字數 4467 閱讀 5849

const應用:

一、對於基本宣告

const int r=100;//標準const變數宣告加初始化,編譯器經過型別檢查後直接用100在編譯時替換。 

二、對於指標

1. int x=10; const int *r=&x; //指標指向的內容是常量,r指向的內容不能夠通過r改變,但如果是非const,內容可以通過自己改變,而且r指標可以改變,可以指向其它的整形.

//*r=*r+1;no //x++;yes //r=&y;yes

2. int const *r=&x; 與1完全相同

3. int * const r=&x; //指標指向是常量,不能修改去指向其它內容,但指向的內容可以修改

//r=&y;no //*r=*r+1;yes //x++;yes 

4.const int * const r=&x; //綜合1、3用法,r是乙個指向常量的常量型指標,指標指向不能改變,指標內容不能改變,內容可以自身改變

//r=&y;no //*r=*r+1;no //x++;yes

三、對於型別檢查

可以把非const物件賦予const指標,這樣就不能改變.但是不能把const賦給非const,除非先強制轉換

const int x=100; int *p=(int*)&x; *p++;

四、對於函式

1.void fuction1(const int r); //此處為引數傳遞const值,意義是變數初值不能被函式改變

2.const int fuction1 (int); //此處返回const值,意思指返回的原函式裡的變數的初值不能被修改,但是函式按值返回的這個變數被製成副本,能不能被修改就沒有了意義,它可以被賦給任何的const或非const型別變數,完全不需要加上這個const關鍵字。

3.class cx; //內部有建構函式,宣告如cx(int r =0)

cx fuction1 ()

const cx fuction2 ()

fuction1() = cx(1); //沒有問題,可以作為左值呼叫

fuction2() = cx(1); //編譯錯誤,const返回值禁止作為左值呼叫。

4.函式中指標的const傳遞和返回:

int f1 (const char *pstr); //作為傳遞的時候使用const修飾可以保證不會通過這個指標來修改傳遞引數的初值

const char *f2();//意義是函式返回的指標指向的物件是乙個const物件,它必須賦給乙個同樣是指向const物件的指標

const char * const f3(); //比上面多了乙個const,這個const的意義只是在他被用作左值時有效,它表明了這個指標除了指向const物件外,它本身也不能被修改,所以就不能當作左值來處理。

五、對於類

1.首先,對於const的成員變數,只能在建構函式裡使用初始化成員列表來初始化,試圖在建構函式體內進行初始化const成員變數會引起編譯錯誤。初始化成員列表形如:

x:: x ( int ir ): r(ir) {} //假設r是類x的const成員變數

注意:類的構造和析構函式都不能是const函式。

2.建立了乙個const成員函式,但仍然想用這個函式改變物件內部的資料。(函式不能修改類的資料成員)

//假如有乙個叫做x的類,它有乙個int成員變數r,我們需要通過乙個const成員函式f( )來對這個r進行++r操作,**如下

void x::f( ) const

//通過this指標進行型別強制轉換實現

---------------------------static----------------------------

對於乙個完整的程式,記憶體中的分布情況:

**********

|      **區     |

------------------

| 全域性資料區 |

------------------

|       堆區        |

-----------------

|        棧區      |

**********

一般程式的由new產生的動態資料存放在堆區,函式內部的自動變數存放在棧區,全域性變數和static變數放在全域性資料區

static的作用主要有以下3個:

1、擴充套件生存期;

2、限制作用域;

3、唯一性

static:

一、面向過程設計中的static

1、[靜態全域性變數] //在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變數。

靜態全域性變數有以下特點: 

1)該變數在全域性資料區分配記憶體; 

2)未經初始化的靜態全域性變數會被程式自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化); 

3)靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外(extern)是不可見的;  

定義全域性變數就可以實現變數在檔案中的共享,但定義靜態全域性變數還有以下好處: 

1)靜態全域性變數不能被其它檔案所用; 

2)其它檔案中可以定義相同名字的變數,不會發生衝突;

2、[靜態區域性變數] 在區域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態區域性變數。

通常,在函式體內定義了乙個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。但有時候我們需要在兩次呼叫之間對變數的值進行儲存。通常的想法是定義乙個全域性變數來實現。但這樣一來,變數已經不再屬於函式本身了,不再僅受函式的控制,給程式的維護帶來不便。

靜態區域性變數正好可以解決這個問題。靜態區域性變數儲存在全域性資料區,而不是儲存在棧中,每次的值保持到下一次呼叫,直到下次賦新值。

靜態區域性變數有以下特點:

1)該變數在全域性資料區分配記憶體; 

2)靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化; 

3)靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0; 

4)它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作      用域隨之結束;

3、靜態函式

在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

定義靜態函式的好處: 

1)靜態函式不能被其它檔案所用; 

2)其它檔案中可以定義相同名字的函式,不會發生衝突;

二、物件導向的static關鍵字(類中的static關鍵字)

1、靜態資料成員

在類內資料成員的宣告前加上關鍵字static,該資料成員就是類內的靜態資料成員。

靜態資料成員有以下特點:

1)而靜態資料成員被當作是類的成員。無論這個類的物件被定義了多少個,靜態數 據成員在程式中也只有乙份拷貝,由該型別的所有物件共享訪問。

2)靜態資料成員儲存在全域性資料區,屬於本類的所有物件共享,所以,它不屬於特定的類物件,在沒有產生類物件時其作用域就可見,即在沒有產生類的例項時,我們就可以操作它; 

同全域性變數相比,使用靜態資料成員有兩個優勢: 

1)靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性;

2)可以實現[資訊隱藏]。靜態資料成員可以是private成員,而全域性變數不能;

2、靜態成員函式

它為類的全部服務而不是為某乙個類的具體物件服務。與普通函式相比,靜態成員函式由於不是與任何的 物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式。

關於靜態成員函式,可以總結為以下幾點: 

1)出現在類體外的函式定義不能指定關鍵字static; 

2)靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式; 

3)非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員; 

4)靜態成員函式不能訪問非靜態成員函式和非靜態資料成員

-----------------------------------extern----------------------------

extern

1 基本解釋

extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。通過這種行為它告訴編譯器:該變數/函式的定義已經存在在某個地方了,讓編譯器到其他的模組去尋找它的定義。

另外,extern也可用來進行鏈結指定。

2. extern   「c」

使用extern「c」主要是因為c++語言在編譯的時候為了實現多型,會將函式名和函式結合起來形成另外一種函式名(總之就是說編譯後的函式名與你之前自己宣告時的函式名會不一樣),而c語言中無多型的概念當然也就不會有這種奇異的名字變化問題。這是問題就出現了,當你要在c++中呼叫c函式時,由於名字的不同,所以它會找不到所呼叫的這個函式的定義,因而會出錯。   

為了解決這一c與c++的矛盾衝突,就有了extern "c'。

const,static,extern簡介(重要)

注意 很多blog都說使用巨集,會消耗很多記憶體,我這驗證並不會生成很多記憶體,巨集定義的是常量,常量都放在常量區,只會生成乙份記憶體。常見的常量 抽成巨集 define xmgaccount account define xmguserdefault nsuserdefaults standard...

C CHECKEDLISTBOX控制項用法總結

一般認為 foreach object obj in checkedlistbox1.selecteditems 即可遍歷選中的值。其實這裡遍歷的只是高亮的值並不是打勾的值。遍歷打勾的值要用下面的 for int i 0 i 參考 最近用到checklistbox控制項,在使用其過程中,花了較多的時...

assert 函式用法總

assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include void assert int expression assert的作用是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort...