欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

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

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:火龙论坛正试运营阶段,欢迎大家多提些建设性意见……
摘自:http://www.devbean.net/2012/05/cpp11-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,每行一个。

Tags:

发表评论