c++類成員變量初始化相關問題


對於內置變量的自動初始化

代碼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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM