2012-02-18 228 views
2

初始化時使用默認構造函數(編譯器生成) 「靜態初始化」或「動態初始化」?靜態或動態初始化

我的意思是,在

class test{ 
    int m; 

public : 
    test(): m(12) {} 

}; 

test i; 

int main() 
{// 
} 

這裏時i得到初始化 - 在編譯時或者是動態初始化,即是可以安全使用於其他文件i用於初始化或其他東西?
如果用戶定義了默認構造函數會怎麼樣?

+3

問題的癥結在於:「當這些對象具有用戶定義的構造函數時,如何初始化全局/命名空間範圍對象?」。答案可以在標準的§3.6.2中找到。在這種情況下,'i.m'會被靜態初始化爲0,並被動態地初始化爲12,然而,如果默認構造函數被聲明爲'constexpr',那麼'i.m'會被靜態初始化爲12。 – Mankarse 2012-02-18 10:27:07

回答

2

由於test有一個構造函數,它將在對象初始化時運行。該對象將被放置到被初始化爲零的存儲區中。你甚至可以通過之前創建對象後使用i.m初始化值測試:

extern test i; 
int dummy1 = i.m; 
test i; 
int dummy2 = i.m; 

當你然後打印dummy1dummy2你應該得到012,分別。如果你想要靜態初始化i你需要但使用像

test i = { 12 }; 

這隻能帶豆莢的作品。總之,請注意全球數據總是不好的。只是不要打擾和正確做事。