1、在全域域中聲明的變數會自動初始化為0,如: double salary; int day; 2、如果變數是在局部域中定義的,或是通過new運算式動態分配的,則系統不會向它提供初始值0,這些對象被認為是未初始化,其值隨機。而類對象會通過預設建構函式自動初始化 3、C++支援兩種形式的初始化: 使用賦值操作符的顯示文法形式。如:int ival=1024; 隱式形式,初始值被放在括弧中。如:int ival (1024); 4. 數組可以顯示地用一組數初始化,如: const int aray_size=3; int ia[aray_size]={0,1,2}; int a[5] ={0}; 則a的各各元素都初始化為0 如果指定的維數大於給定的元素的個數,沒有被顯示初始化的元素將置為0。也可以不指定維數值,如: int ia[]={0,1,2}; 5. 全域變數的初始化 對於不同編譯模組的全域變數,其初始化的順序沒有任何的保證,因此對不同編譯模組裡的全域變數,在它們的初始化順序之間建立依賴性都是不明智的。此外也沒辦法捕捉到全域變數初始化拋出的異常,一般來說要減少全域變數的使用,特別是限制那些要求複雜初始化的全域變數。so: 1)、盡量不用全域變數 2)、用靜態變數,通過訪問器進行訪問 例如:全域變數 int a = 5; int b = a; 如果a,和b定義在同一個檔案裡,那沒什麼問題,結果b等於5. 如果a和b定義在不同檔案裡,就不能保證b也等於5,也就是說不能保證a先初始化.事實上,除了在同一個檔案定義的全域對象的初始化是按照定義次序來進行的之外,其他全域或靜態變數之間的初始化次序沒有任何保障。解決這種問題的方法是不直接使用全域變數,而改用一個封裝函數來訪問,例如 int get_a() { static int a = 5; return a; } int get_b() { static int b = get_a(); return b; } 這樣的話,無論get_a和get_b是否定義在同一個檔案中,get_b總是能夠返回正確的結果,原因在於,函數內部的靜態變數是在第一次訪問的時候來初始化。 任何時候,如果在不同的被編譯單元中定義了"非局部靜態對象",並且這些對象的正確行為依賴於它們被初始化的某一特定順序,就會產生問題.你絕對無法控制不同被編譯單元中非局部靜態對象的初始化順序.對於函數中的靜態對象(即"局部"靜態對象)它們在函數調用過程中初次碰到對象的定義時被初始化.. PS:千萬不要寫出和編譯順序相關的程式來。 關於全域變數的初始化,C語言和C++是有區別的。 在C語言中,只能用常數對全域變數進行初始化,否則編譯器會報錯。 在C++中,如果在一個檔案中定義了int a = 5;要在另一個檔案中定義int b = a;的話,前面必須對a進行聲明:extern int a;否則編譯不通過.、即使是這樣,int b = a;這句話也是分兩步進行的:在編譯階段,編譯器把b當作是未初始化資料而將它初始化為0;在執行階段,在main被執行前有一個全域對象的構造過程, int b = a;被當作是int型對象b的拷貝初始化構造來執行。 其實,準確地說,在C++中全域對象、變數的初始化是獨立的,如果不是象int a = 5;這樣的已初始化資料,那麼就是象b這樣的未初始化資料。 而C++中全域對象、變數的建構函式調用順序是跟聲明有一定關係的,即在同一個檔案中先聲明的先調用。對於不同檔案中的全域對象、變數,它們的建構函式調用順序是未定義的,取決於具體的編譯器。 |
偶在加一句聲明類時,不能給資料成員賦初值,因為類是一個抽象概念,並不分配記憶體,只有執行個體化為對象時才對相應的資料成員進行初始化。