[英]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.