homework-07

C++11新特性学习

本人几乎没有写过C++,所写内容完全建立在与其他语言的比较上。观点偏激请见谅。

阅读的博客

我阅读了如下文章:

C++11新特性

lambda表达式

首先我最感兴趣的是lambda表达式。lambda表达式源于函数式编程,在C++中相当于简写的匿名函数。在C中,所有的函数都是平行的,不能在函数中定义函数。而有些时候,我们需要一个临时的函数,可能只会调用一次。如果把它单独拿出来写成一个函数不仅不方便,还容易造成污染。lambda表达式就是为了应对这种情况而产生的。lambda表达式可以用比较简洁的语法在行内直接定义一个临时函数,不仅方便,而且也限制了别人的访问,更私有。

不过说实话跟ruby比起来实在是弱爆了……当然ruby是动态语言这样比并不公平。

自动类型推导 auto

自动类型推导,顾名思义,就是自动推导出变量的类型。在C++03中,在声明对象时,你必须指定对象的类型。然而,在许多情况下,对象声明时都有初始化,C++11利用了这个优势,允许你声明对象时不指定类型:

    auto x=0;       // x has type int because 0 is int 
    auto c='a';     // char 
    auto d=0.5;    // double 
    auto national_debt=14400000000000LL;    //long long 

自动类型推导主要用于对象类型很长很麻烦的时候,或者是对象是自动生成的时候(使用模板时)。

自动类型推导虽然方便,但不应滥用。比如下面的代码的可读性就降低了。因为,我不知道ProcessData返回什么?int?bool?还是对象?或是别的什么?这让你后面的程序不知道怎么做。

    auto obj = ProcessData(someVariables);

但是下面的程序就没有问题,因为pObject的型别在后面的new中有了。

    auto pObject = new SomeType<OtherType>::SomeOtherType();

关于自动类型推导我想说……放下类型,立地成佛阿,弄了这么个奇奇怪怪的东西是何苦呢。

空指针nullptr

C++11 引入了新的关键字来代表空指针常数:nullptr

    char* pc = nullptr;     // OK  
    int * pi = nullptr;     // OK  
    int    i = nullptr;     // error  

    foo(nullptr);           // 呼叫 foo(char *)  

以范围为基础的 for 循环

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

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

for语句这么写可以很方便地遍历vector这类的容器。请注意,你依然可以用continue语句来开始下一次迭代,使用break跳出循环。这一点和普通的for循环一样。

自己定义的类也可以放在ranged-based for loops中进行迭代。事实上要想进行迭代,一个类需要满足以下条件: begin函数和end函数,作用是分别指向第一个数据和最后一个数据。返回值是一个可以自己定义的迭代器。

总结与提问

我能看懂的也就上面这些了。可能是这学期接触了ruby的缘故,C++11这些新特性在我看来有点让人困惑:咦?C++原来没有这些功能吗?

好吧,C++是如此的快速以至于你不能在别的放面对它要求太高。但说实话,太丑陋了。

相比之下,我更喜欢c和ruby。我不会用C写非常庞大的程序,也不会用ruby写对效率要求很高的程序。把时间用在真正需要思考的地方才是最好的。

问题:

  1. C++的优势在哪?
  2. 除了运行效率?
  3. 除了面试题?
  4. 类型真的是必不可少的吗?
  5. 如果是,原因是什么?
  6. 有没有可能实现运行效率与实现效率的兼得?
  7. 如果可能,怎么做?是否需要牺牲其他的东西?
  8. C++的设计理念是什么?

由于自身知识有限,观点可能非常偏激幼稚理想,求打醒。如果连我都无法说服,那么就和我一起偏激幼稚理想吧。

posted @ 2013-11-09 21:32  zjoe  阅读(190)  评论(1编辑  收藏  举报