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

本文探讨了C++11如何通过引入智能指针、自动类型推断等特性简化传统C++编程,并增强了代码的健壮性和异常安全性。文章对比了C++11前后实现相同功能的代码差异。

       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 types
circle* 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 types
auto 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)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值