美文网首页
C++ 11 新特性

C++ 11 新特性

作者: 平平文文点滴 | 来源:发表于2018-08-26 21:15 被阅读0次

    C++11 中值得关注的几大变化(详解) | | 酷 壳 - CoolShell

    1.  delete  和 default

    【C/C++】C++11新特性:=default 和 =delete - CSDN博客

    1.1 delete 可以禁止某种方法或函数。

    可以禁止拷贝构造函数生成。赋值构造函数生成。 

    1.2禁止函数某种类型的形参。

    1.3 可以通过禁止new 操作符对象只存放在栈内存。

    default 可以显示地生成默认函数。

    引入的原因:  虽然用private 可以禁止调用拷贝构造函数,但一旦声明了拷贝构造函数, 默认构造函数就不会生成,如果你需要默认构造函数,就必须显示定义一个。即使这个默认构造函数什么都不做。

    2. auto 

    auto 使代码更简洁,编译器可以根据初始化类型推导出变量类型。

    一般用在STL 中, 如STL 的迭代器中。

    3. nullptr 

    null 这个宏存在很多bug, 有的编译器会把他定义成0, 有的会把他定义成(void*) 0.  所以有时会存在二义性。

    在重载函数中:

    void fun(int );

    void fun(char *)

    fun(0) 会调用 哪个??

    在C++11 新特性, fun(nullptr) 会调用 fun(char *),

    所以在C++11 中请以nullptr 初始化指针。

    4. 移动语义

    移动语义的引入是为了解决在进行大数据复制的时候,将动态申请的内存空间的所有权直接转让出去,不用进行大量的数据移动,既节省空间又提高效率。

    浅拷贝: 单纯的地址值拷贝, 不会重新分配内存。不同对象的指针会指向相同的地址空间,就会引发重复释放的问题。

    深度拷贝: 会重新分配内存。但是对于生存周期马上结束的将亡值, 临时值, 深度拷贝会减慢效率。

    考虑到浅拷贝和深度拷贝的缺点, 所以引入了移动语义,通过的  move 语句把内存的所有权转移。1. 函数返回值是右值。 2. move 语句显示转化为右值。 会触发移动语义。

    5. lambda 

    引入 lambda 的意义有2个方面:1.  代码简洁, 用在STL 语句中, 如 for_each. 编译器会默认把lambda 转化为 函数对象。 2.  lambda 函数限制了私有性,只在该函数体内被使用。

    相关文章

      网友评论

          本文标题:C++ 11 新特性

          本文链接:https://www.haomeiwen.com/subject/hoqniftx.html