簡體   English   中英

為什么在C ++ 11中允許第二次初始化

[英]Why is second initialization allowed in C++11

在C ++ 11下,可以在聲明時直接初始化類成員。 但是也可以在構造函數的初始化列表中再次初始化它們......為什么?

#include <iostream>



struct MyStr
{

    MyStr()
    :j(0)
    {
        std::cout << "j is " << j << std::endl; // prints "j is 0"
    }

    const int j = 1;

};

int main()
{
    const int i = 0;

    MyStr mstr; 
}

因為做這樣的事情是一個錯誤,可以理解:

MyStr()
:j(0),
j(1)
{
}

第一個例子有什么不同,數據成員在聲明時初始化,然后再在構造函數的初始化列表中初始化?

實際上只發生一次初始化。 只是你被允許以brace-or-equals初始化程序的形式編寫一個“默認”,但是如果你的構造函數初始化程序列表也指定了一個初始化程序,那么它就是唯一使用它的程序。

作為旁注,從C ++ 14開始,可以為聚合的非靜態數據成員(不能具有構造函數)提供大括號或等於初始化程序

這樣單個構造函數可以覆蓋它。

原始功能提案

可能會發生數據成員通常具有特定值,但是一些專門的構造函數需要認識到該值。 如果構造函數顯式初始化特定成員,則構造函數初始化將覆蓋成員初始化,如下所示: [..]

請記住,您可以擁有多個構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM