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來修辭,就意味着,該變量會作爲一個寄存器變量,讓該變量的訪問速度達到最快。