homework-06-C++11
阅读原文时间:2024年09月30日阅读:1

http://blog.csdn.net/lancelet/article/details/7220558

http://www.csdn.net/article/2012-05-15/2805585

http://wenku.it168.com/d_001049706.shtml

http://mindhacks.cn/2012/08/27/modern-cpp-practices/

http://www.cnblogs.com/zhuyp1015/category/370450.html

新特性

c++11一方面对c++的语言特性进行了拓展,一方面又对它容易令人混淆和纠结不清的地方做了规定。我阅读了一些奇奇怪怪的博客,打算就谈以下几点我比较感兴趣且作为一个没有任何c++编程基础的人能理解的新特性:

1、Lambda函数与表示式

C++中,标准程序库算法函数是很有效的东西,而诸如 sort 和 find,用户经常希望能够在算法函数调用的附近定义一个临时的述部函数。由于语言本身允许在函数内部定义类型,可以考虑使用函数对象,然而这通常既麻烦又冗赘。

C++11 对 lambda 的支持可以解决上述问题。

一个 lambda 函数可以用如下的方式定义:

[](int x, int y) { return x + y; }

表示接受0个外部变量,2个参数,返回两个参数x和y的和。

2、初始化列表

C++允许多种初始化方式,比如说 String s="shabi" 或者String s=new String("shabi")。C++11约定了使用{}来进行标准化的初始化。

比如:SequenceClass someVar = {1, 4, 5, 6};

vector v = { "xyzzy", "plugh", "abracadabra" };

3、类型推导

有被明确初始化的变量可以使用 auto 关键字。这会依据该初始化子(initializer)的具体类型产生变量:

auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);
auto otherVariable = 5;

someStrangeCallableType 的类型就是模板函数 boost::bind 对特定引数所回返的类型。作为编译器语义分析责任的一部份,这个类型能够简单地被编译器决定,但用户要通过查看来判断类型就不是那么容易的一件事了。

4、以范围为基础的 for 循环

Boost C++ 定义了许多"范围 (range) "的概念。范围表现有如受控制的串行 (list),持有容器中的两点。有序容器是范围概念的超集 (superset),有序容器中的两个迭代器 (iterator) 也能定义一个范围。这些概念以及操作的算法,将被并入 C++11 标准程序库。不过 C++11 将会以语言层次的支持来提供范围概念的效用。

for 述句将允许简单的范围迭代:

int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
x *= 2;
}

上面 for 述句的第一部份定义被用来做范围迭代的变量,就像被声明在一般 for 循环的变量一样,其作用域仅只于循环的范围。而在":"之后的第二区块,代表将被迭代的范围。这样一来,就有了能够允许 C-style 数组被转换成范围概念的概念图。这可以是 std::vector,或是其他符合范围概念的对象。

疑问和分析

lambda函数终于出现在c++了,应用在sort,find这类需要传入简短函数中感觉还算不错,不过lambda表达式早已经在很多语言上都提供支持了,使用lambda表达式对于增加语言的简洁性有着不错的效果。不过在c++这种遍地是指针的古老的命令式风格的语言中,引入这种函数式编程的东西没问题么。

有人说,c++11“使得 C++ 成为更易于教学的语言(语法更加一致化和简单化)”,不是很能理解这里所说的一致化和简单化,c++11中加入的新语法特性显然是让语法更复杂化。而那些对c++语法的限制和规定也只是小修小补,大部分只是为了让老程序员意识到:”哦,以前我这么做很麻烦而且会产生歧义,现在它帮我限制了自己“。 这也只是对老手而言,对于我这种新手看来还是感觉很复杂,语法繁多。

在我的理解中,c++的优势在于其具有很强的标准库(STL),比较好的元编程支持(容器),和从c语言继承过来的高效率。但它对面向对象的支持没有java做得彻底和规范,效率没有c高,元编程没有Lisp,Ruby强,语法规则也没有Python,Lisp简洁。 所以C++新特性并没有对c++的定位带来多少改观,经验丰富的c++程序会觉得它对自己带来了很好的便利性,而对于使用其他语言编程的程序员来说吸引力不大。

在摩尔定律达即将达到极限,并行计算受到关注的现在,我觉得函数式语言特性会是以后编程语言发展的主要趋势。可以看到比较新的语言比如python,ruby都大量支持函数式编程风格,更别说打着函数式语言名头的scala,haskell,lisp家族的clojure,racket。函数式编程是基于lambda calculus公理设计的,是一套和图灵机等价的计算模型(出现的比图灵机早,八卦一下,它的发明者是图灵的导师丘奇)。它的一个很大的特点是:函数是一种基本类型。这种对于”计算能力“的抽象使得其可以把每一个函数分发给不同的cpu,来实现很方便的并行编程。lambda 表达式的威力在c++中似乎只剩下了”传递一个临时函数指针“,所以我觉得只能说c++是为了赶时髦而吸收了lambda表达式,把它加入到古老的c++语法里的目的仅仅是为了方便而已,而其背后强大的并行计算潜力被忽视了。

由于种种原因,我基本没学过c++和c#。据我推测,微软的员工很有可能被要求使用windows系统,使用windows+vs作为开发环境,使用c# .net开发图形界面,使用c++开发底层程序。由于种种不为人知的原因,我习惯使用linux系统,用linux下各种open的工具来开发程序。从对环境的认同感和适应性来说,这种人是不是不大适合去微软工作?

总而言之,由于自身”基本没用过c++“,所以很多新特性看得都云里雾里,难以深入理解。由于知识面的限制,很有可能我对c++11的理解是”完全错误的“,所以如有说错请多包涵。