为什么 C++11 允许二次初始化
Why is second initialization allowed in C++11
在 C++11 下,可以在声明时直接初始化 class 成员。但是在构造函数的初始化列表中再初始化一次也是可以的...为什么?
#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)
{
}
第一个示例有何不同,其中数据成员在声明时被初始化,然后在构造函数的初始化列表中再次初始化?
以便单个构造函数可以覆盖它。
来自the original feature proposal:
It may happen that a data member will usually have a particular value, but a few specialized constructors will need to be cognizant of that value. If a constructor initializes a particular member explicitly, the constructor initialization overrides the member initializations as shown below: [..]
请记住,您可以有多个构造函数。
只有一个初始化实际发生。只是允许您以 大括号或等于初始化程序 的形式编写 "default" 一个,但是如果您的构造函数初始化程序列表也指定了一个初始化程序,那个是唯一使用的。
附带说明,从 C++14 开始,可以为聚合的非静态数据成员提供 大括号或等于初始值设定项(不能有构造函数)。
在 C++11 下,可以在声明时直接初始化 class 成员。但是在构造函数的初始化列表中再初始化一次也是可以的...为什么?
#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)
{
}
第一个示例有何不同,其中数据成员在声明时被初始化,然后在构造函数的初始化列表中再次初始化?
以便单个构造函数可以覆盖它。
来自the original feature proposal:
It may happen that a data member will usually have a particular value, but a few specialized constructors will need to be cognizant of that value. If a constructor initializes a particular member explicitly, the constructor initialization overrides the member initializations as shown below: [..]
请记住,您可以有多个构造函数。
只有一个初始化实际发生。只是允许您以 大括号或等于初始化程序 的形式编写 "default" 一个,但是如果您的构造函数初始化程序列表也指定了一个初始化程序,那个是唯一使用的。
附带说明,从 C++14 开始,可以为聚合的非静态数据成员提供 大括号或等于初始值设定项(不能有构造函数)。