【发布时间】:2013-09-15 11:17:13
【问题描述】:
我遇到了一个名为“成员初始化器”的奇怪概念。
Here 说:
C++11 添加了成员初始化器,应用于成员的表达式 如果构造函数没有初始化成员本身,则在类范围内。
它的定义是什么?
有没有一些例子来说明它的用法?
【问题讨论】:
-
点击那里的“C++11”链接,搜索“member i”,...,利润?
标签: c++ class c++11 member-initialization
我遇到了一个名为“成员初始化器”的奇怪概念。
Here 说:
C++11 添加了成员初始化器,应用于成员的表达式 如果构造函数没有初始化成员本身,则在类范围内。
它的定义是什么?
有没有一些例子来说明它的用法?
【问题讨论】:
标签: c++ class c++11 member-initialization
它可能是指类内成员初始化器。这允许您在声明点初始化非静态数据成员:
struct Foo
{
explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
int i = 42;
double x = 3.1416;
};
更多信息请关注Bjarne Stroustrup's C++11 FAQ。
【讨论】:
您现在可以在类中添加构造函数共享的初始化器:
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
};
它避免了在构造函数中重复初始化器,对于大型类来说,这可能是一个真正的胜利。
【讨论】:
C++11 允许这样的非静态成员初始化:
class C
{
int a = 2; /* This was not possible in pre-C++11 */
int b;
public:
C(): b(5){}
};
【讨论】:
private: 中创建int a = 2; int b;,而不是public。
private。
成员初始化器是指可以在类定义中设置的初始化器的扩展。例如,您可以使用
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。请注意,成员初始化器不限于内置类型。您还可以在成员初始化器列表中使用统一初始化语法。
【讨论】:
来自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;
【讨论】: