[英]Does a c++ struct have a default constructor?
我寫了以下代碼片段:
void foo()
{
struct _bar_
{
int a;
} bar;
cout << "Value of a is " << bar.a;
}
並用g ++ 4.2.1(Mac)編譯它。 輸出為“a的值為0”。
是否真的說c ++中的結構的數據成員默認是初始化的(與c相比)? 或者觀察到的結果是巧合嗎?
我可以想象c ++中的結構有一個默認構造函數(因為結構和類在c ++中幾乎相同),這可以解釋為什么bar的數據成員a初始化為零。
簡單的答案是肯定的。
它有一個默認的構造函數。
注意:struct和class是相同的(除了訪問說明符的默認狀態)。
但它是否初始化成員將取決於實際對象的聲明方式。 在您的示例中,沒有成員未初始化且具有不確定的值。
void func()
{
_bar_ a; // Members are NOT initialized.
_bar_ b = _bar_(); // Members are zero-initialized
// From C++14
_bar_ c{}; // New Brace initializer (Members are zero-initialized)
_bar_* aP = new _bar_; // Members are NOT initialized.
_bar_* bP = new _bar_(); // Members are zero-initialized
// From C++14
_bar_ cP = new _bar_{}; // New Brace initializer (Members are zero-initialized)
}
// static storage duration objects
// i.e. objects at the global scope.
_bar_ c; // Members are zero-initialized.
具體細節在8.5 Initializers [dcl.init]
第4-10段的標准中解釋。 但以下是對這種情況的簡單總結。
沒有用戶定義構造函數的結構具有編譯器生成的構造函數。 但它的作用取決於它是如何使用的,它將默認初始化其成員(對於POD類型通常沒有)或者它可能零初始化其成員(對於POD通常意味着將其成員設置為零)。
PS。 不要使用_
作為類型名稱中的第一個字符。 你會碰到問題。
是否真的說c ++中的結構的數據成員默認是初始化的(與c相比)? 或者觀察到的結果是巧合嗎?
這是巧合。
您的代碼調用未定義的行為; 除非您明確將成員設置為0
否則它們可以是任何內容。
不是答案,但你可能會認為......如果你想嘗試一下:
void foo() {
struct test {
int value;
} x;
std::cout << x.value << std::endl;
x.value = 1000;
}
int main() {
foo();
foo();
}
在您的示例中,內存在創建變量之前已經具有0
值,因此您可以將其稱為幸運巧合 (事實上,某些操作系統會在啟動進程之前將所有內存清零,這意味着0很可能是值在一個小的短程序中查找...),前面的代碼將調用該函數兩次,並且第一次調用的內存將在第二次調用中重用,可能是第二次調用它將打印1000.但是請注意該值仍未定義,並且此測試可能顯示或未顯示預期結果(即編譯器可以執行許多操作並生成不同的結果...)
默認情況下,不初始化結構的成員變量。 就像一個類(因為結構與類完全相同,只有在結構中,成員默認是公共的)。
不要依賴這個功能它是非標准的
加上
foo() : a() {}
我不記得gcc 4.2的確切狀態(我認為它太舊了)但是如果你使用C ++ 11你可以做以下事情
foo()=default;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.