各種C 關鍵字的作用

2021-07-23 17:59:57 字數 4312 閱讀 5239

一. static

static關鍵字至少有下列5個作用:

(1)設定變數的儲存域,函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;

(2)限制變數的作用域,在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)限制函式的作用域,在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;

以下是c++對static的擴充套件

(4)在類中的static成員變數意味著它為該類的所有例項所共享,也就是說當某個類的例項修改了該靜態成員變數,其修改值為該類的其它所有例項所見;

(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。

在linux的模組程式設計中,為了避免不同模組的函式名和變數名出現重名,所有的函式和全域性變數都要用static關鍵字宣告,將其作用域限制在本模組內部。

二.const

1.修飾常量(const常量)

const常量,如const int max = 100;

優點:const常量有資料型別,而(define)巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 .

另外,const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而#define給出的是立即數,所以,const常量在程式執行過程中只有乙份拷貝,而#define常量在記憶體中有若干個拷貝,可以節省空間。

2.修飾指標

int b = 500;

const

int* a = &b; //情況一

intconst* a = &b; //情況二

int* const a = &b; //情況三

const

int* const a = &b; //情況四

const的作用分析:

如果const位於號的左側,那麼const就是用來修飾指標所指向的變數的,即指標指向為常量;如果const位於號的右側,那麼const就是用來修飾指標本身,即指標本身為常量。

所以1和2兩種情況是一樣的,都是指標所指向的內容為常量,這兩種情況下不能對內容進行更改。

int b = 500;   

const

int* a = &b;

*a = 600; //錯誤

要想使*a變成600,可以b = 600。或者使用下面的操作:

int b = 500, c = 600;

const

int* a = &b;

a = &c; //此時a為600

並且這時候可以不進行初始化,因為雖然指標內容為常量,但指標本身不是常量:

const

int* a; //正確

對於情況三,指標本身為常量,這時候不能對指標本身進行更改操作,但是指標所指向的內容不是常量。並且這種情況下,定義的同時必須進行初始化。

int b = 500, c = 600;

int * const a ; //錯誤,沒有進行初始化

int* const a = &b;

*a = 600; //正確,指標指向不是常量,可以更改

*a++; //錯誤,指標本身不能更改

對於情況四,指標本身和指標指向都不能進行更改。

3.修飾類的成員變數

類的const資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的。如果類建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類宣告中初始化const資料成員,因為類的物件未被建立時,編譯器不知道const 資料成員的值是什麼。如:

class

a

const資料成員的初始化只能在類的建構函式的初始化表中進行。

4.修飾類成員函式

有一些函式成員不改變類的資料成員,也就是說這些函式是唯讀函式,將這些函式加上const關鍵字進行標識,能提高程式的可讀性。已定義成const的成員函式,假如想要修改資料成員的值,編譯器會報錯。同時應注意,關鍵字const必須以同樣的方法出現在函式申明和實現中,不然編譯器會將他們看成兩個函式。但是c++也允許我們在資料成員的定義前面加上mutable,以允許該成員可以在常量函式中被修改。

在c++中,mutable是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改。mutable在類中只能夠修飾非靜態資料成員。

int getnum() const  ;    //const成員函式
將const放在函式名的前面,那麼意味著函式的返回值是常量,意義完全不一樣了。

const成員函式能夠訪問物件的const成員,而其他成員函式不可以。const物件只能訪問const成員函式,而非const物件可以訪問任意的成員函式,包括const成員函式。

5.修飾函式形參

const修飾函式引數的時候,表示函式的引數不能被改變。最常用的就是引數為引用時,為了增加效率同時防止修改。修飾引用引數時:

void function(const type& var); //引用引數在函式內為常量不可變

這樣的乙個const引用傳遞和最普通的函式按值傳遞的效果是一模一樣的,他禁止對引用的物件的一切修改,唯一不同的是按值傳遞會先建立乙個類物件的副本, 然後傳遞過去,而引用直接傳遞位址,所以這種傳遞比按值傳遞更有效率。

6.修飾函式返回值

可以阻止使用者修改返回值。返回值也要相應的付給乙個常量或常指標。

三. explicit

c++中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式( 或者除了第乙個引數以外的其他引數都有預設值), 它的作用是表明該建構函式是顯示的, 而非隱式的, 跟它相對應的另乙個關鍵字是implicit, 意思是隱藏的,類建構函式預設情況下即宣告為implicit(隱式).

顯示宣告的建構函式和隱式宣告的區別:

如果建構函式只有乙個引數時, 那麼在編譯的時候就會有乙個預設的轉換操作:將該建構函式對應資料型別的資料轉換為該類物件.

例如:x x = 10; 編譯的時候自動轉化為x x1(10); x x = x1;

explicit關鍵字的作用就是防止類建構函式的隱式自動轉換.

explicit關鍵字只對有乙個引數的類建構函式有效, 如果類構造函式引數大於或等於兩個時, 是不會產生隱式轉換的, 所以explicit關鍵字也就無效了.

四.extern

修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。

1.extern修飾變數的宣告。舉例來說,如果a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,a.c要引用到v,不只是取決於在a.c中宣告extern int v,還取決於變數v本身是能夠被引用到的。能夠被其他模組以extern修飾符引用到的變數通常是全域性變數。還有很重要的一點是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函式fun定義的開頭處宣告extern int v,然後就可以引用到變數v了,只不過這樣只能在函式fun作用域中引用v罷了,這還是變數作用域的問題。

2.extern修飾函式宣告。從本質上來講,變數和函式沒有區別。函式名是指向函式二進位制塊開頭處的指標。如果檔案a.c需要引用b.c中的函式,比如在b.c中原型是int fun(int mu),那麼就可以在a.c中宣告extern int fun(int mu),然後就能使用fun來做任何事情。就像變數的宣告一樣,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的檔案作用域的範圍中。對其他模組中函式的引用,最常用的方法是包含這些函式宣告的標頭檔案。使用extern和包含標頭檔案來引用函式有什麼區別呢?extern的引用方式比包含標頭檔案要簡潔得多!extern的使用方法是直接了當的,想引用哪個函式就用extern宣告哪個函式。這樣做的乙個明顯的好處是,會加速程式的編譯(確切的說是預處理)的過程。

3.此外,extern修飾符可用於指示c或者c++函式的呼叫規範。比如在c++中呼叫c庫函式,就需要在c++程式中用extern 「c」宣告要引用的函式。這是給鏈結器用的,告訴鏈結器在鏈結的時候用c函式規範來鏈結。主要原因是c++和c程式編譯完成後在目標**中命名規則不同。

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

c 關鍵字mutable作用

在 c 中,mutable 是為了突破 const 的限制而設定的。被 mutable 修飾的變數,將永遠處於可變的狀態,即使在乙個 const 函式中,甚至結構體變數或者類物件為 const,其 mutable 成員也可以被修改。struct test const struct test test...

C 關鍵字static作用

關鍵字static作用?static可以用作函式和變數的字首 在模組內的static變數可以被模組內所有函式訪問,但不能被模組外其他函式訪問。在模組內的static函式只可被這一模組內的其他函式呼叫,這個函式的使用範圍被限制在宣告它的模組內。2.1函式體內static變數的作用範圍為該函式體,不同於...