static
C中:
1.隱藏
2.保持變量的持久
3.初始化為0
C++:
4.共享
引用和指針:
(1)指針:指針是一個(gè)變量,只不過這個(gè)變量存儲(chǔ)的是一個(gè)地址,指向內(nèi)存的一個(gè)存儲(chǔ)單元;而引用跟原來的變量實(shí)質(zhì)上是同一個(gè)東西,只不過是原變量的一個(gè)別名而已。
(2)可以有const指針,但是沒有const引用;
(3)指針可以有多級(jí),但是引用只能是一級(jí)(int **p;合法 而 int &&a是不合法的)
(4)指針的值可以為空,但是引用的值不能為NULL,并且引用在定義的時(shí)候必須初始化;
(5)指針的值在初始化后可以改變,即指向其它的存儲(chǔ)單元,而引用在進(jìn)行初始化后就不會(huì)再改變了。
(6)"sizeof引用"得到的是所指向的變量(對(duì)象)的大小,而"sizeof指針"得到的是指針本身的大小;
(7)指針和引用的自增(++)運(yùn)算意義不一樣;
const
頂層const: 對(duì)象本身是const
底層const: 所指對(duì)象是const
define
宏定義
typedef
類型別名, 新用法, using
typedef有兩種用法:
一、一般形式,定義已有類型的別名
typedef 類型 定義名;
二、創(chuàng)建一個(gè)新的類型
typedef 返回值類型 新類型名(參數(shù)列表);
1)typedef int NUM[10];//聲明整型數(shù)組類型
NUM n;//定義n為整型數(shù)組變量,其中n[0]--n[9]可用
2)typedef char* STRING;//聲明STRING為字符指針類型
STRING p,s[10];//p為字符指針變量,s為指針數(shù)組
3)typedef int (*POINTER)();//聲明POINTER為指向函數(shù)的指針類型,該函數(shù)返回整型值,沒有參數(shù)
POINTER P1,P2;//p1,p2為POINTER類型的指針變量
auto
自動(dòng)推導(dǎo)變量類型。
這個(gè)這個(gè)關(guān)鍵字用于聲明變量的生存期為自動(dòng),即將不在任何類、結(jié)構(gòu)、枚舉、聯(lián)合和函數(shù)中定義的變量視為全局變量,而在函數(shù)中定義的變量視為局部變量。這個(gè)關(guān)鍵字不怎么多寫,因?yàn)樗械淖兞磕J(rèn)就是auto的。
decltype
推導(dǎo)類型
register
這個(gè)關(guān)鍵字命令編譯器盡可能的將變量存在CPU內(nèi)部寄存器中而不是通過內(nèi)存尋址訪問以提高效率。
sizeof 與 strlen
- sizeof是運(yùn)算符, 在編譯時(shí)就計(jì)算好了, strlen是函數(shù), 要在運(yùn)行時(shí)才能計(jì)算;
- sizeof可以用類型做參數(shù), strlen只能用char*做參數(shù), 且必須是以“\0”結(jié)尾的;
- 數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了;
extern
- 在C語言中,修飾符extern用在變量或者函數(shù)的聲明前,用來說明“此變量/函數(shù)是在別處定義的,要在此處引用”。
- 在C++中extern還有另外一種作用,用于指示C或者C++函數(shù)的調(diào)用規(guī)范。比如在C++中調(diào)用C庫函數(shù),就需要在C++程序中用extern “C”聲明要引用的函數(shù)。這是給鏈接器用的,告訴鏈接器在鏈接的時(shí)候用C函數(shù)規(guī)范來鏈接。主要原因是C++和C程序編譯完成后在目標(biāo)代碼中命名規(guī)則不同,用此來解決名字匹配的問題。
volatile
表明某個(gè)變量的值可能在外部被改變,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。它可以適用于基礎(chǔ)類型如:int,char,long......也適用于C的結(jié)構(gòu)和C++的類。當(dāng)對(duì)結(jié)構(gòu)或者類對(duì)象使用volatile修飾的時(shí)候,結(jié)構(gòu)或者類的所有成員都會(huì)被視為volatile.
該關(guān)鍵字在多線程環(huán)境下經(jīng)常使用,因?yàn)樵诰帉懚嗑€程的程序時(shí),同一個(gè)變量可能被多個(gè)線程修改,而程序通過該變量同步各個(gè)線程。
簡單示例:
DWORD __stdcall threadFunc(LPVOID signal)
{
int* intSignal=reinterpret_cast(signal);
intSignal=2;
while(intSignal!=1)
sleep(1000);
return 0;
}
該線程啟動(dòng)時(shí)將intSignal 置為2,然后循環(huán)等待直到intSignal 為1 時(shí)退出。顯然intSignal的值必須在外部被改變,否則該線程不會(huì)退出。但是實(shí)際運(yùn)行的時(shí)候該線程卻不會(huì)退出,即使在外部將它的值改為1,看一下對(duì)應(yīng)的偽匯編代碼就明白了:
mov ax,signal
label:
if(ax!=1)
goto label
對(duì)于C編譯器來說,它并不知道這個(gè)值會(huì)被其他線程修改。自然就把它c(diǎn)ache在寄存器里面。C 編譯器是沒有線程概念的,這時(shí)候就需要用到volatile。volatile 的本意是指:這個(gè)值可能會(huì)在當(dāng)前線程外部被改變。也就是說,我們要在threadFunc中的intSignal前面加上volatile關(guān)鍵字,這時(shí)候,編譯器知道該變量的值會(huì)在外部改變,因此每次訪問該變量時(shí)會(huì)重新讀取,所作的循環(huán)變?yōu)槿缦旅鎮(zhèn)未a所示:
label:
mov ax,signal
if(ax!=1)
goto label
注意:一個(gè)參數(shù)既可以是const同時(shí)是volatile,是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它。
volatile并不能保證非源自性操作的多線程安全問題得到解決,volatile解決的是多線程間共享變量的可見性問題,而例如多線程的i++,++i,依然還是會(huì)存在多線程問題,它是無法解決了.
http://www.cnblogs.com/zemliu/p/3298685.html
++前置, ++后置, --前置, --后置
explicit
C++中的explicit關(guān)鍵字只能用于修飾只有一個(gè)參數(shù)的類構(gòu)造函數(shù), 它的作用是表明該構(gòu)造函數(shù)是顯示的, 而非隱式的, 跟它相對(duì)應(yīng)的另一個(gè)關(guān)鍵字是implicit, 意思是隱藏的,類構(gòu)造函數(shù)默認(rèn)情況下即聲明為implicit(隱式).
default
delete
mutable
在C++中,mutable也是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠(yuǎn)處于可變的狀態(tài),即使在一個(gè)const函數(shù)中。