读书频道 > 网站 > 网页设计 > 深入应用C++11:代码优化与工程级应用
1.3.1 统一的初始化
15-07-07    下载编辑
收藏    我要投稿   
在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的立即去当当网订购
在上面我们已经看到了,对于普通数组和POD类型,C++98/03可以使用初始化列表(initializer list)进行初始化:

int i_arr[3] = { 1, 2, 3 };
long l_arr[] = { 1, 3, 2, 4 };

struct A
{
   int x;
   int y;
} a = { 1, 2 };

但是这种初始化方式的适用性非常狭窄,只有上面提到的这两种数据类型可以使用初始化列表。

在C++11中,初始化列表的适用性被大大增加了。它现在可以用于任何类型对象的初始化,如代码清单1-8所示。

代码清单1-8 通过初始化列表初始化对象

class Foo
{
public:
       Foo(int) {}

private:
       Foo(const Foo &);
};

int main(void)
{
       Foo a1(123);
       Foo a2 = 123; // error: 'Foo::Foo(const Foo &)' is private

       Foo a3 = { 123 };
       Foo a4 { 123 };

       int a5 = { 3 };
       int a6 { 3 };

       return 0;
}

在上例中,a3、a4使用了新的初始化方式来初始化对象,效果如同a1的直接初始化。

a5、a6则是基本数据类型的列表初始化方式。可以看到,它们的形式都是统一的。

这里需要注意的是,a3虽然使用了等于号,但它仍然是列表初始化,因此,私有的拷贝构造并不会影响到它。

a4和a6的写法,是C++98/03所不具备的。在C++11中,可以直接在变量名后面跟上初始化列表,来进行对象的初始化。

这种变量名后面跟上初始化列表方法同样适用于普通数组和POD类型的初始化:

int i_arr[3] { 1, 2, 3 }; // 普通数组

struct A
{
   int x;
   struct B
   {
      int i;
      int j;
   } b;
} a { 1, { 2, 3 } }; // POD 类型

在初始化时,{ }前面的等于号是否书写对初始化行为没有影响。

另外,如同读者所想的那样,new操作符等可以用圆括号进行初始化的地方,也可以使用初始化列表:

int* a = new int { 123 };
double b = double { 12.12 };
int* arr = new int[3] { 1, 2, 3 };

指针a指向了一个new操作符返回的内存,通过初始化列表方式在内存初始化时指定了值为123。

b则是对匿名对象使用列表初始化后,再进行拷贝初始化。

这里让人眼前一亮的是arr的初始化方式。堆上动态分配的数组终于也可以使用初始化列表进行初始化了。

除了上面所述的内容之外,列表初始化还可以直接使用在函数的返回值上:

struct Foo
{
   Foo(int, double) {}
};

Foo func(void)
{
   return { 123, 321.0 };
}

这里的return语句就如同返回了一个Foo(123, 321.0)。

由上面的这些例子可以看到,在C++11中使用初始化列表是非常便利的。它不仅统一了各种对象的初始化方式,而且还使代码的书写更加简单清晰。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站