關鍵字-----static 、const、inline、volatile....

static:

作用:

1)未被初始化的靜態變量初始化爲0。如果一個全局或局部變量加上關鍵字static,則它的默認初始化值就爲0。

2)隱藏(鏈接屬性 )。如果一個變量或函數加上關鍵字static,則它只能在本文件內有效,其他文件是不能訪問它的,從而有效的保護了改變量或函數不會被其他文件修改。

3)使局部變量內容持久化 如果一個局部變量被聲明爲靜態的,則它的存儲位置就從棧變成了靜態存儲區,棧的內容出了作用域就會被銷燬,而靜態區的直到程序結束才銷燬。

4)可以用在類的成員函數以及成員變量中。

static用於類中:

靜態數據成員以及靜態函數,不屬於任何一個對象,是所有對象所共享的。

靜態數據成員不能在構造函數中初始化,需要在類外初始化。格式爲:類型 類名::靜態數據成員=值。

用法:類名::靜態數據成員。

靜態成員函數只能訪問靜態數據成員、靜態成員函數和類以外的函數和數據,不能訪問類中的非靜態數據成員(因爲非靜態數據成員只有對象創建時纔有意義)靜態成員函數、靜態數據成員可以被任何權限許可的函數訪問。


inline:(內聯)

在一個函數前加上inline 該函數就變成了內聯函數。內聯函數就是在它被調用的地方展開。(類似於宏,但和宏有一定的區別)必須和函數的定義在一起。

作用:主要使用在一些短小而調用非常頻繁的函數中,因爲其沒有函數調用(壓棧)的開銷,所以提升了運行效率。

在類中實現的函數默認是內聯函數。

內聯函數和宏的區別:

1)宏是在預處理時進行替換,而內聯函數是在編譯時展開。

2)inline函數可以進行類型的檢查,宏無法進行類型檢查。

3)宏容易出現二異性、副作用等。

4)inline直接在嵌入到目標代碼中,宏作簡單的文本替換。

inline使用的場合:

1)使用宏定義的函數都可以用內聯函數替換

2)類的成員接口函數。

哪些地方不能用內聯:

1)如果函數代碼較長,最好不用內聯,會導致內存消耗太大。

2)函數內部有循環,函數執行時間比函數調用時間長。


const:

一個變量加上const修飾後,就變成了只讀變量(不等於常亮),一般不可以被修改。

修飾指針:

const int *p 、int const *p 兩條語句等價,const修飾*p,即*p不可被修改,p可以被修改。

int *const p const修飾p,即p不可以被修改,*p可被修改。

int const *const p *p、p都不可以被修改。

作用:

1)定義const變量,使變量不會被修改,有效的保護了該變量。防止被意外修改。

2)便於進行類型檢查。

3)高效(編譯器一般不爲const變量分配存儲空間,而是將它保存在符號表中)

const與宏常量的區別:

1)const常量有數據類型,宏常量沒有數據類型,所以沒有類型的檢查,是不安全的。

2)const可以進行調試,宏不可以調試,無法檢查錯誤。

const在類中的應用:

1)常對象:類名 const 對象名 或 const 類名 對象名

 定義常對象時必須進行初始化,而且其數據成員不能被更新。

2)常對象成員函數:類型 函數名(參數表)const

 常成員函數不更新對象的數據成員,也不能調用該類中沒有用const修飾的成員函數。

 如果一個對象被聲明爲一個常對象,則通過常對象只能調用它的常成員函數,不能調用其他成員函數

 可以參與區分重載函數 void print(); void print() const 

3)常數據成員:構造函數只能通過初始化列表對常數據成員進行初始化。


volatile:

作用:確保指令不會因爲編譯器的優化而省略。即防止編譯器對代碼進行優化。用它聲明的變量可以被某些編譯器未知的因素改變。

例如:定義一個全局變量,進行多次讀這個變量,不做修改,這時編譯器就會做一些優化,將這個變量暫存到寄存器中,等下一次讀這個變量時就不必在內存中讀,而是到寄存器中讀取,這樣大大提高了效率。但也會出現一些問題,如果此時有另一個函數修改該變量,只會修改內存中該變量的值,不會改變寄存器中的值,這時第一個函數再從寄存器中訪問這個變量,就不會是我們預期的結果。

解決方法就是加上關鍵字volatile,每次訪問該變量都從內存中訪問,修改該變量就不會出問題。

  1 #include<stdio.h>
  2 #include<signal.h>
  3 #include<stdlib.h>
  4 volatile int a = 0;
  5 void handler(int sig)
  6 {
  7     printf("the %d signal is coming\n",sig);
  8     a=a+1;
  9 }
 10 int main()
 11 {
 12     signal(SIGINT,handler);
 13     while(!a);
 14     return 0;
 15 }
//不加關鍵字volatile 並且使編譯器進行優化
[fbl@localhost volatile]$ make clean;make
rm -f volatile
gcc -o volatile volatile.c -O2 
[fbl@localhost volatile]$ ./volatile 
^Cthe 2 signal is coming
^Cthe 2 signal is coming
^Cthe 2 signal is coming
^\Quit (core dumped)

//加關鍵字volatile
[fbl@localhost volatile]$ make clean;make
rm -f volatile
gcc -o volatile volatile.c -O2 
[fbl@localhost volatile]$ ./volatile 
^Cthe 2 signal is coming
[fbl@localhost volatile]$


auto:

作用:auto被解釋爲一個自動存儲變量的關鍵字,也就是申明一塊臨時的變量內存


extern:

extern可置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量或函數時,在其它模塊中尋找其定義。另外,extern也可用來進行鏈接指定。

在使用extern時候要嚴格對應聲明時的格式


refister:

作用:如果一個變量被register來修辭,就意味着,該變量會作爲一個寄存器變量,讓該變量的訪問速度達到最快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章