我遇到了一个名为“member initializer”的奇怪概念。
Here说:
C ++ 11添加了成员初始值设定项,要应用于成员的表达式 在类范围内,如果构造函数没有初始化成员本身。
它的定义是什么?
是否有一些例子来说明它的用法?
答案 0 :(得分:16)
它可能指的是类内成员初始值设定项。这允许您在声明点初始化非静态数据成员:
struct Foo
{
explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
int i = 42;
double x = 3.1416;
};
答案 1 :(得分:6)
您现在可以在类中添加为构造函数共享的初始值设定项:
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
};
它避免了必须在构造函数中重复初始化器,对于大型类,它可以是一个真正的胜利。
答案 2 :(得分:1)
C ++ 11允许非静态成员初始化,如下所示:
class C
{
int a = 2; /* This was not possible in pre-C++11 */
int b;
public:
C(): b(5){}
};
答案 3 :(得分:0)
来自here: -
非静态数据成员初始化器是一个相当简单的新方法 特征。事实上,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;
答案 4 :(得分:0)
成员初始化器指的是可以在类定义中设置初始化器的扩展。例如,您可以使用
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
。请注意,成员初始值设定项不限于内置类型。您还可以在成员初始化列表中使用统一初始化语法。