物件資料成員的初始值

Wang-wonk發表於2020-09-27

物件資料成員的初始值

物件的建構函式的作用是初始化類的成員變數,但是如果我們不顯式定義建構函式,編譯器就會給我們定義一個預設建構函式;這個預設建構函式中其實是什麼都沒有做的,如果這樣,我們生成該類的物件之後,它的資料成員值為多少呢?

具體程式如下:

#include <iostream>
using namespace std;

class Base{
public:
    int val;
};

Base b;

int main()
{
    Base c;
    Base *base = new Base;
    cout << "base->val is:" << base->val << endl;
    cout << "b.val is:" << b.val << endl;
    cout << "c.val is:" << c.val << endl;
}

編譯程式並多次執行上述程式,發現三次執行結果都不相同

base->val is:8002976
b.val is:0
c.val is:0

base->val is:7412416
b.val is:0
c.val is:0

base->val is:16325312
b.val is:0
c.val is:0

對上述程式執行結果分析可得出以下結論:

  • 由於C++規定不顯式初始化的靜態變數和全域性變數應該初始化為0,因此靜態/全域性變數的資料成員會被自動初始化為0
  • 區域性變數的分配是在棧上的,因此區域性物件的資料成員的值為隨機值
  • 使用new分配的資料成員位於堆上,C++並沒有規定其初始值,因此其也為隨機數

注意:以上2、3 結果為理論結果,本人實測使用MinGW(windows)和Ubuntu下分別編譯,程式執行結果不同

Ubuntu下,base->val始終為0,而c.val為隨機數,二者正好相反

相關文章