from:
http://ww2w.blog.sohu.com/69144612.html1. 在全局域中聲明的變量會(huì)自動(dòng)初始化為0,如:
double salary;
int day;
2. 如果變量是在局部域中定義的,或是通過(guò)new表達(dá)式動(dòng)態(tài)分配的,
則系統(tǒng)不會(huì)向它提供初始值0,這些對(duì)象被認(rèn)為是未初始化,其值隨機(jī)。
而類對(duì)象會(huì)通過(guò)缺省構(gòu)造函數(shù)自動(dòng)初始化
3. C++支持兩種形式的初始化:
1:使用賦值操作符的顯示語(yǔ)法形式。如:int ival=1024;
2: 隱式形式,初始值被放在括號(hào)中。如:int ival (1024);
4. 數(shù)組可以顯示地用一組數(shù)初始化,如:
const int aray_size=3;
int ia[aray_size]={0,1,2};
int a[5] ={0}; 則a的各各元素都初始化為0
如果指定的維數(shù)大于給定的元素的個(gè)數(shù),沒(méi)有被顯示初始化的元素將置為0。也可以不指定維數(shù)值,如: int ia[]={0,1,2};
5. 全局變量的初始化
對(duì)于不同編譯單位的全局變量,其初始化的順序沒(méi)有任何的保證,因此對(duì)不同編譯單位里的全局變量,在它們的初始化順序之間建立依賴性都是不明智的。
此外也沒(méi)辦法捕捉到全局變量初始化拋出的異常,一般來(lái)說(shuō)要減少全局變量的使用,特別是限制那些要求復(fù)雜初始化的全局變量。so:
1,盡量不用全局變量
2,用靜態(tài)變量,通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)
例如:全局變量
int a = 5;
int b = a;
如果a,和b定義在同一個(gè)文件里,那沒(méi)什么問(wèn)題,結(jié)果b等于5.
如果a和b定義在不同文件里,就不能保證b也等于5,也就是說(shuō)不能保證a先初始化.
事實(shí)上,除了在同一個(gè)文件定義的全局對(duì)象的初始化是按照定義次序來(lái)進(jìn)行的之外,其他全局或靜態(tài)變量之間的初始化次序沒(méi)有任何保障。解決這種問(wèn)題的方法是不直接使用全局變量,而改用一個(gè)包裝函數(shù)來(lái)訪問(wèn),例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}
這樣的話,無(wú)論get_a和get_b是否定義在同一個(gè)文件中,get_b總是能夠返回正確的結(jié)果,原因在于,函數(shù)內(nèi)部的靜態(tài)變量是在第一次訪問(wèn)的時(shí)候來(lái)初始化。
任何時(shí)候,如果在不同的被編譯單元中定義了"非局部靜態(tài)對(duì)象",并且這些對(duì)象的正確行為依賴于它們被初始化的某一特定順序,就會(huì)產(chǎn)生問(wèn)題.你絕對(duì)無(wú)法控制
不同被編譯單元中非局部靜態(tài)對(duì)象的初始化順序.對(duì)于函數(shù)中的靜態(tài)對(duì)象(即"局部"靜態(tài)對(duì)象)它們?cè)诤瘮?shù)調(diào)用過(guò)程中初次碰到對(duì)象的定義時(shí)被初始化..
PS:千萬(wàn)不要寫出和編譯順序相關(guān)的程序來(lái)。
關(guān)于全局變量的初始化,C語(yǔ)言和C++是有區(qū)別的。
在C語(yǔ)言中,只能用常數(shù)對(duì)全局變量進(jìn)行初始化,否則編譯器會(huì)報(bào)錯(cuò)。
在C++中,如果在一個(gè)文件中定義了int a = 5;要在另一個(gè)文件中定義int b = a;的話,前面必須對(duì)a進(jìn)行聲明:extern
int a;否則編譯不通過(guò).、即使是這樣,int b =
a;這句話也是分兩步進(jìn)行的:在編譯階段,編譯器把b當(dāng)作是未初始化數(shù)據(jù)而將它初始化為0;在執(zhí)行階段,在main被執(zhí)行前有一個(gè)全局對(duì)象的構(gòu)造過(guò)程,
int b = a;被當(dāng)作是int型對(duì)象b的拷貝初始化構(gòu)造來(lái)執(zhí)行。
其實(shí),準(zhǔn)確地說(shuō),在C++中全局對(duì)象、變量的初始化是獨(dú)立的,如果不是象int a = 5;這樣的已初始化數(shù)據(jù),那么就是象b這樣的未初始化數(shù)據(jù)。
而C++中全局對(duì)象、變量的構(gòu)造函數(shù)調(diào)用順序是跟聲明有一定關(guān)系的,即在同一個(gè)文件中先聲明的先調(diào)用。對(duì)于不同文件中的全局對(duì)象、變量,它們的構(gòu)造函數(shù)調(diào)用順序是未定義的,取決于具體的編譯器。