首页 C++ C++11 新特性:非 static 数据成员初始化器

C++11 新特性:非 static 数据成员初始化器

0 1.6K

参考文章:https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_non_static

C++11 标准已经颁布一段时间。越来越多的编译器开始支持 C++11。按照 C++ 之父 Bjarne Stroustrup 的看法,C++11 “感觉就像一个新语言,一个更好的新语言”。豆子从来不反对在现有或者新的项目中使用更新的技术。新的技术往往带来更好的性能——无论是开发性能还是运行性能。除了那些稳定的项目,或者有特殊需求的项目,新生事物应该更容易被技术人员所接受。在此,豆子会列出一系列 C++11 新增加的功能点,希望能够尽早被广发开发人员所熟知,并且能够应用到正式的项目中。

在本节中,除了名字看起来有些拗口外,其实内容还是很好理解的。非 static 数据成员的初始化器是一个相当直截了当的特性。事实上,早在 C++98 的年代,GCC Bugzilla 就已经发现,许多 C++ 用户试图使用这个功能(不过在当时,这种语法是非法的)。这个特性在 Java 中早就有了,只不过现在才添加到 C++ 中来。

GCC 则是在 gcc-4.7.0 版本中才提供了这个实现。

简单来说,这个特性就是使下面的代码变得合法:

struct A
{
    int m;
    A() : m(7) { }
};

struct B
{
    int m = 7; // 非 static 数据成员初始化器
};

因此,下面的代码:

A a;
B b;

std::cout << a.m << '\n';
std::cout << b.m << std::endl;

将输出两个 7。因为 a 和 b 的成员数据 m 都被初始化为 7。

非 static 数据成员初始化器也可以被覆盖,因此:

struct C
{
    int m = 7; // 非 static 数据成员初始化器
    C() : m(14) { } // 初始化列表覆盖掉初始化器的赋值
};

C c;

std::cout << c.m << std::endl;

将输出 14,而不是 7。

这在实际应用中很有用,因为我们可以由此减少很多构造函数的代码。我们可以使用初始化器将数据成员赋一个默认值,而使用构造函数进行某些数据值的特化。

上面的例子使用的是内置的 int 类型,但是,这个特性可以用于任意类型的数据成员,比如std::stringstd::vector或者用户定义的类型。这个特性也可以同其他 C++11 特性相结合,比如初始化器列表等。例如:

struct D
{
    std::vector m{4, 5, 6};
};

而下面的代码

D d;

std::cout << d.m[0] << '\n';
std::cout << d.m[1] << '\n';
std::cout << d.m[2] << std::endl;

将会输出 4,5,6,每行一个。

发表评论

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2