C++11简介 —— “在写一种很新的代码”

C++11标准可以说是近20年来C++语言标准最剧烈的一次修订,远远比前两次修订变动要大。因而,在C++语言标准委员会内部的讨论,以及在C++语言的社区和应用业界引发的震动和影响也极为深远。

为什么这样讲呢?因为在这一次修订中,对于C++语言的核心部分做了相当大的改动。

什么是一门语言的核心部分呢?就是指一门语言不需要任何库(包括标准库)支持的那部分。只要是一个符合标准的C++语言的编译器,无论运行在什么硬件和操作系统上,只要程序员使用的是C语言,就应该可以使用的那部分语言特性。比如,基本类型和量化饰词、基本语句如if和for、函数声明语法、外部连接指示等,这些就属于语言核心。而像STL提供的标准容器如vector和、标准算法如findsort等就不属于语言核心。由于语言核心涉及程序设计的根本,对于这部分的变更必然会立刻影响到一切未来的代码,并衍生出一系列可预见或未预见的习惯用法(或扭曲用法),所以会特别谨慎。此次对于这部分的变更动作相当大,主要目的有若干个:

  • 一是强化静态类型推导,比如C++11标准变更了auto关键字的语义,引入了decltype关键字等,这些措施利用了既存的变量和函数返回值的类型,一方面增加了程序设计的弹性,一方面避免了书写不必要的类型防止可能的错误,而引入了constexpr关键字则进一步地将常量性的范围从单个变量扩展到了单次运算,这将使得一大批既有的代码通过简单的修改而带来可观的编译期优化。

  • 二是支持函数式程序设计的语法,比如引入了入表达式、引入了尾式函数声明语法、增加了for语句的冒号语法进行指定范围遍历等,这些使得从函数式语言切换过来的程序员能够很容易地习惯C++这门新语言,也给予了把C++作为第一门或唯一工作语言来学习的程序员以全新的方式书写原本易错的复杂声明和返回值赋值的机会。

  • 三是将构造、析构和赋值过程中的可能错误加以防范,尤其是临时对象生命期相关的错误,为此C++11标准引入了右值引用(&&饰词)、默认和禁用构造函数等。

  • 四是增加了对于面向对象范型中的一些一直未能涵盖之内容的补充,如允许继承而来的构造函数、引入表达禁止继承的final关键字、引入override关键字来支持派生类函数重写等。可以肯定的是,之前一大批为了和C++语言的不足之处而斗争的习惯用法将逐渐消失,而学习和消化新的语言特性形成新的习惯用法将是今后数年C++语言社区的一大任务。

当然,C++11对于标准库、STL和泛型的扩充也绝对不可小觑,但这些变更主要是为了配合语言核心的变更。比如:

  • 为支持右值引用带来的对象所有权的流转,引入了move算法 - 这在数学意义上也是对于代数完备性的一个有力补充,更不用说由此带来的可观存储效率的提升了。

  • 还有新引入的三种智能指针和四种无序关联容器、字符串和数值类型互相转换的工具函数,以及新引入的若干针对标准容器的小改进,如顺序容器的常量起始和终止迭代器以及可以直接插入值而不必再构造临时变量的emplace函数族,等等。这一切都说明:尽管据Bjarne Stroustrup本人的说法,C++11可以“几乎百分之百地兼容已有的C++代码”,但是C++语言已经今非昔比,几乎是一种全新语言了。我们非常需要拥抱变化,使自己适应C++的崭新时代

计划:


  • 1.C++11简介
  • 2.统一的列表初始化
  • 3.简化声明 - auto、decltype - nullptr
  • 4.范围for循环
  • 5.final与override
  • 6.智能指针
  • 7.STL新增加容器 - 静态数组array、forward_list以及unordered系列
  • 8.类的新功能:默认成员函数控制
  • 9.右值引用
  • 10 lambda表达式
  • 11 函数包装器
  • 12 线程库

你可能感兴趣的:(C++,c++,开发语言,c语言)