對於內置變量的自動初始化
代碼1
1 #include<stdio.h> 2 #define CONST 100 3 int *p1; 4 int a[2]; 5 int b; 6 static int c; 7 main() 8 { 9 int d; 10 static int e; 11 int f[2]; 12 int *p2; 13 printf("CONST=%d\n",CONST); 14 printf("a[0]=%d\n",a[0]); 15 //printf("*p1=%d\n",*p1); 16 printf("b=%d\n",b); 17 printf("c=%d\n",c); 18 printf("d=%d\n",d); 19 printf("e=%d\n",e); 20 printf("f[0]=%d\n",f[0]); 21 printf("*p2=%d\n",*p2); 22 }
輸出:
CONST=100
a[0]=0
b=0
c=0
d=2514932
e=0
f[0]=1307813
*p2=457819009
數據區存放已初始化的全局變量,靜態變量(包括全局和局部的),常量。
未初始化數據區(uninitializeddata segment,BSS)存放全局未初始化的變量。BSS的數據在程序開始執行之前被初始化為0或NULL。BSS段的變量在目標文件中只占一個符號位,編譯器並沒有給變量分配空間,所謂的“初始化為0”是指要鏈接階段才申請了空間,並隨即初始化為0。而已初始化的全局變量要在占用目標文件的大小的。
換句話說全局變量,靜態變量(包括全局和局部的),常量未顯式初始化被默認地初始化時0或NULL。
如果試圖打印*p1則會發生段錯誤,因為p1指向的是一個NULL地址。
而局部的非靜態變量未顯式初始化時是一個隨機的數,一般是個很大的數。
對於類類型變量的自動初始化
不論是在全局還是局部作用域,類類型變量都會調用“默認構造函數”進行初始化。
所謂“默認構造函數”就是指空參數的構造函數。
代碼2
class A{ public: int value; A(){ cout<<"Intitialize A"<<endl; value=3; } }; A a1; int main(){ A a2; cout<<a1.value<<endl; cout<<a2.value<<endl; return 0; }
輸出:
Intitialize A
Intitialize A
3
3
如果類沒有顯式地定義任何構造函數,則編譯器會自動為其生成空參數的構造函數,稱為“合成默認構造函數”。“合成默認構造函數”初始化成員的規則有3條:
1.對象在全局作用域或為靜態局部對象時,則類的內置成員變量被初始化為0.
2.對象在局部作用域定義時,則類的內置成員變量不被初始化為0。
代碼3
class A{ public: int value; }; A a1; int main(){ A a2; static A a3; cout<<a1.value<<endl; cout<<a2.value<<endl; cout<<a3.value<<endl; return 0; }
輸出:
0
2510836 (這里不為0,很多程序沒有初始化,看到手動初始化是非常必須的。並不是無所謂。)
0
3.對於類類型成員按照其自身的(合成)默認構造函數進行初始化。
代碼4
class A{ public: int value; A(){ value=5; } }; class B{ public: int value; A a; }; B b1; int main(){ B b2; cout<<b1.value<<"\t"<<b1.a.value<<endl; cout<<b2.value<<"\t"<<b2.a.value<<endl; return 0; }
輸出:
0 5
134514784 5
代碼5
class A{ public: int value; }; class B{ public: int value; A a; }; B b1; int main(){ B b2; cout<<b1.value<<"\t"<<b1.a.value<<endl; cout<<b2.value<<"\t"<<b2.a.value<<endl; return 0; }
輸出:
0 0
134514736 -1081710584
如果類顯式提供了帶參數的構造函數,則編譯器不會再為其生成空參數的構造函數。這時候就不能用空參數來定義類類型變量。下面的代碼是錯誤的:
class A{ public: int value; A (int i):value(i){} }; int main(){ A a; return 0; }
轉自:http://www.cnblogs.com/zhangchaoyang/articles/2671551.html