开始使用C++11的几个理由

最后更新于:2022-04-01 06:32:31

C++11新特性介绍了一段时间,至今为止也差不多了。是要总结的时候了:  你可能会问我,为什么需要C++11呢,我这就给出理由: **理由1**:《[C++11新特性之 Move semantics(移动语义)](http://blog.csdn.net/wangshubo1989/article/details/49748703 "move")》  move语义(move semantics)。简单的说,它是优化复制的一种方式。有时候复制很显然是浪费的。如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区再复制要高效得多。他之所以能工作是因为源对象超出了范围。  然而,在这以前C++并没有判断源对象是不是临时对象的机制。move语义通过除了复制操作外还允许你有一个move构造函数(move constructor)和一个move赋值运算(move assignment)符来提供这个机制。  当你在Visual Studio 2010中使用标准库中的类如string或vector时,它们已经支持move语义了。这可以防止不必要的的复制从而改善性能。  通过在你的类中实现move语义你可以获得额外的性能提升,比如当你把它们存储到STL容器中时。还有,move语义不仅可以应用到构造函数,还可以应用到方法(如vector的push_back方法)。 **理由2:**《[吐血整理C++11新特性](http://blog.csdn.net/wangshubo1989/article/details/48490035 "auto")》  auto关键字可以自动推断类型,所以下面的代码: ~~~ vector<vector<MyType>>::const_iterator it = v.begin() ~~~ 现在可以很简单的写成: ~~~ auto it = v.cbegin() ~~~ 尽管有些人会说,它隐藏了类型信息,在我看来它利大于弊,因为它减少了视觉混换并展示了代码的行为,还有它可以让你我少打很多字!  理由5:Lambda表达式提供了一种方法来定义匿名方法对象(实际上是闭包),这是代码更加线性和有规律可循。这在和STL算法结合使用时很方便:  bool is_fuel_level_safe()  {  return all_of(_tanks.begin(), _tanks.end(),  [this](Tank& t) { return t.fuel_level() > _min_fuel_level; });  } **理由3:**新的智能指针(smart pointer)替换了有问题的auto_ptr,你可以不用担心内存的释放并移除相关释放内存的代码了。这让代码更清晰,并杜绝了内存泄露和查找内存泄露的时间。 **理由4**:《[C++11新特性之std::function](http://blog.csdn.net/wangshubo1989/article/details/49134235 "function")》把方法作为first class object是一个非常强大的特性,这让你的代码变得更灵活和通用了。C++的std::function提供了这方面的功能。方法提供一种包装和传递任何可调用的东西-函数指针, 仿函数(functor), lambda表达式等。 **理由5**:《[c++11特性之override和final关键字](http://blog.csdn.net/wangshubo1989/article/details/49539251 "final override")》还有许多其它小的功能,如override、final关键字和nullptr让你的代码意图更明确。对我来说,减少视觉混乱和代码中能够更清楚地表达我的意图意味着更高兴、更高效。 **理由6**:《[C++11新特性之 Static assertions 和constructor delegation](http://blog.csdn.net/wangshubo1989/article/details/49786813 "static assertion")》  C++ 11提供了一种方法来检查先决条件并尽早的在可能的时机捕获错误-编译过程  这是通过静态断言(static_assert)和类别属性模版实现的。这种方法的另一个好处是,它不需要占用任何的运行时开销,没有什么性能损失!
';