我遇到了一个名为“成员初始化器”的奇怪概念。
这里说:
C++11 添加了成员初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员。
它的定义是什么?
有没有一些例子来说明它的用法?
我遇到了一个名为“成员初始化器”的奇怪概念。
这里说:
C++11 添加了成员初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员。
它的定义是什么?
有没有一些例子来说明它的用法?
它可能指的是类内成员初始化器。这允许您在声明点初始化非静态数据成员:
struct Foo
{
explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
int i = 42;
double x = 3.1416;
};
您现在可以在类中添加构造函数共享的初始化程序:
class A
{
int i = 42;
int j = 1764;
public:
A() {} // i will be 42, j will be 1764
A( int i ) : i(i) {} // j will be 1764
};
它避免了在构造函数中重复初始化,对于大型类来说,这可能是一个真正的胜利。
成员初始化器是指可以在类定义中设置的初始化器的扩展。例如,您可以使用
struct foo
{
std::string bar = "hello";
std::string baz{"world"};
foo() {} // sets bar to "hello" and baz to "world"
foo(std::string const& b): bar(b) {} // sets bar to b and baz to "world"
};
如果成员初始化器列表没有给出另一个值,则bar
初始化为。hello
请注意,成员初始化器不限于内置类型。您还可以在成员初始化器列表中使用统一初始化语法。
C++11 允许像这样的非静态成员初始化:
class C
{
int a = 2; /* This was not possible in pre-C++11 */
int b;
public:
C(): b(5){}
};
从这里:-
非静态数据成员初始化器是一个相当简单的新特性。事实上,GCC Bugzilla 揭示了 C++ 新手用户经常尝试在 C++98 中使用它,而当时的语法是非法的!必须说,Java 中也有相同的功能,因此将其添加到 C++ 使使用这两种语言的人的生活更轻松。
struct A
{
int m;
A() : m(7) { }
};
struct B
{
int m = 7; // non-static data member initializer
};
thus the code:
A a;
B b;
std::cout << a.m << '\n';
std::cout << b.m << std::endl;