C++11是最新的C++标准。它代表着C++语言开始向Java等高级面向对象语言靠拢。
编程语言分两种:面向过程语言和面向对象语言。面向对象由于极易维护,调试方便,并且与现实世界相像,所以深受程序员喜爱。C语言是古老的面向过程语言,它语法严谨,语句自由,在面向对象语言还未出现以前大受欢迎。在第一个面向对象语言simula 67出现以后,就涌现出各种面向对象语言,像Java、C#等。它们以C为依托,但又有自己的编码风格、特色类库。C自然也不甘落后,比雅尼·斯特劳斯特鲁普发明了C++语言,使用的是纯净的C风格,可以使C程序员毫无压力地转手。目前,C++语言的使用者已经是世界第二,在竞赛、后台等地使用广泛。
C++一开始只是基础地支持了面向对象,引入了class类和virtual虚函数概念,以及namespace命名空间。随着C++的不断发展,它增加了许多新概念,比如long double超长实型,iterator迭代器,iostream输入输出流等。其中最璀璨的理所应当是与Java Util类库、C# Collections类库相媲美的std类库。相信很多编程初学者编写的第一个C++程序中都有一行“using namespace std;”这行语句看似普普通通,实际上将几百名程序员的汗水与思考引入你的程序内。std类库内容丰富,从动态数组vector到元素的映射map,从最简单的输入输出流cin、cout到复杂的Unicode字符串流wstringstream,大大方便了C++程序的开发。
在1958年,LISP语言中就提到了函数式编程的概念。函数式编程是种编程范式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。Haskell就是一个典型的例子。函数式编程可以大大提升算法的作用,使一个算法可以将函数作为输入或输出。为此,在C++11中,特别添加了一个库——functional。这个库可以让你定义一个函数式编程的函数,还可以提供对λ演算的支持。例如C++中著名的sort函数,如果要将原始类型降序排序或将自己的对象排序,你就要写一个别扭的cmp函数。在C++11中,如果要将a数组降序排序,你只需要调用
std::sort(a,a+n,[](int a,int b){return a>b});
即可。这就是著名的λ演算。
C#的使用者都知道C#有一个很好的关键词——var。这个关键词可以自动通过表达式推算出标识符的类型。比如有一个类名是ClassNotSupportException,你在C++老版本中只能写
ClassNotSupportException cnse = ClassNotSupportException.createException();
,不仅显得冗长,还容易打错。但在C++11中,你可以这样写:
auto cnse = ClassNotSupportException.createException();
,不仅方便,还不容易出错。但是注意,auto也是C++99的关键词,用来修饰变量,如果你的编译器是老版,请勿使用。
最后提一句,Dev-c++集成的GCC 4.7.1已经支持C++11,你只需要加入-std=c++11命令即可。