您好,欢迎来到九壹网。
搜索
您的当前位置:首页C++11 新特性:非 static 数据成员初始化器

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

来源:九壹网
C++11 新特性:非 static 数据成员初始化器

作者: DevBean 日期: 2012 年 05 月 11 日发表评论 (0)查看评论

参考文章: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::string,std::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,每行一个。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务