C++11教程0 Welcome back to C++!

来源:互联网 发布:1984书评知乎 编辑:程序博客网 时间:2024/05/20 22:36

       C++作为一门广泛使用的语言,从其问世起,距今已有30年历史。在这30年中,C++本身在不断的更新、变化,在2011年,更是推出了其最新标准C++11(据说C++14也要推出了)。

       我们是否要学习C++11那?如果你现在还在为内存(资源)泄露问题而苦恼,还在为多线程的创建同步而编写大量代码,还在使用老旧臃肿的for循环(特别是遍历容器类型时)语法,那么,是时候做出改变了!

       C++11以现代的方式,赋予了传统C++更强大的功能及灵活性,甚至像是魔术一样的功能(你之前想象过函数的形参个数可以动态变化而无需重载吗?!)。

      作为当代C++程序员,当然要紧跟形势,拿着石器时代的锤子是无法编写出简洁而优雅强壮高效的现代C++代码的!那么,让我们一起开始全新的C++11之旅吧!

现代C++

       上面说了这么多,那么具体什么是现代C++呢?我个人的感觉是,现代C++,其风格更为纯粹的面向对象,语法更为简洁,代码更为健壮同时不易出错。

     下面是MSDN中对于传统C++C++11标准的代码(注:vs2013中对于C++11标准更为完善,大家可以自行下载)的比较,他们均实现了相同的功能。

传统C++:

// circle and shape are user-defined typescircle* p = new circle( 42 ); vector<shape*> v = load_shapes();for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {    if( *i && **i == *p )        cout << **i << “ is a match\n”;}for( vector<circle*>::iterator i = v.begin();        i != v.end(); ++i ) {    delete *i; // not exception safe}delete p;

C++11 标准:

#include <memory>#include <vector>// ...// circle and shape are user-defined typesauto p = make_shared<circle>( 42 );vector<shared_ptr<shape>> v = load_shapes();for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) {    if( s && *s == *p )        cout << *s << " is a match\n";} );

   注意,delete不是异常安全的,而利用智能指针shared_ptr可以自动释放其指向的资源,同时能够保证是异常安全的。而auto关键字则极大的简化了编程,在你定义变量时,他会自动根据上下文来推断你变量的类型(在这里他是shared_ptr<circle>类型,在别的地方auto还可能是int类型……),而不用你自己明确写出变量类型!

现代C++强调:

  • 基于堆栈的范围而不是堆或静态全局范围。
  • 自动类型推断而不用显示的类型名称。(上面的auto而非shared_ptr<circle>
  • 利用stringwstring类型而非char[]字符串
  • 利用stl中的容器而非数组
  • 利用Exception机制来返回错误信息并处理错误(try……catch,例如对于类似函数的错误,不要用返回值如return 0表示正确,非0错误,而是在错误情况下直接抛出异常并catch)
  • 使用 STL std::atomic<>而非其他线程间通信机制的无锁线程间通信。
  • 对于功能单一的简单小函数,使用Inline lambda functions.(类似之前的inline函数)
  • 对于基于范围的for循环(如遍历数组、STL容器,Windows运行时集合),使用具有更强鲁棒性的 for-range-declaration : expression 形式的循环,而非传统for循环

   上面是MSDN中对于现代C++编程所强调的地方。个人感觉有些一时编程感觉会比较别扭,比如不返回错误值而是直接抛出异常,使用 for-range-declaration : expression 形式的循环。

   总之,我们现在已经踏上了现代C++编程之路。

   (本系列教程是基于MSDN关于vs2013支持C++11标准文档为基础的,MSDN原文网址 http://msdn.microsoft.com/zh-cn/library/hh279654.aspx)




0 0