C++_新特性

01 nullptrconstexptr

链接_视频

  • nullptr表示空指针,本质还是0,但具备了类型。
  • 建议程序中使用nullptr代替NULL
  • constexptr常量表示式关键字,用于修饰函数。

02 迭代器与类型推导auto

链接_视频

  • stl中存在一些常用的封装好的数据结构相关的模板类(容器),例如vector(动态数据)list(链表)stack(栈)queue(队列)map(hash表/红黑树)等。
  • 这些类通常都具有一些最基本的操作,例如增加,删除,修改,遍历等。
  • C++为了方便统一,采用了设计模式中的迭代器模式,统一的提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
    1
    2
    3
    4
    5
    std::vector<int> v;
    std::vector<int>::iterator it; // 迭代器,模板类中的内部类
    for(it = v.begin(); it != v.end(); it++) {
    std::cout << *it << std::endl; // *it来访问模板类的具体值
    }
  • auto类型推导关键字,简洁代码。
    1
    2
    3
    4
    std::vector<int> v;
    for(auto it : v) {
    std::cout << *it << std::endl;
    }
  • auto不能用于函数传参。

03 委托构造与继承构造

链接_视频

  • 委托构造指在类中的一个构造函数中调用另一个构造函数,从而达到简化代码的目的。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Base {
    public:
    int v1, v2;
    Base() {
    v1 = 1;
    }
    Base(int v) : Base() { // 委托Base()构造函数
    v2 = v;
    }
    }
  • 利用using关键字引入继承构造概念,实现在子类中完成父类构造函数的调用。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Base {
    public:
    int v1, v2;
    Base() {
    v1 = 1;
    }
    Base(int v) : Base() { // 委托Base()构造函数
    v2 = v;
    }
    }

    class SubClass : public Base {
    public:
    // 直接使用父类的构造函数
    using Base::Base;

    }

04 overridefinaldefaultdelete关键字

链接_视频

  • override关键字显示地告知编译器进行虚函数的重载,编译器将检查基函数是否存在这样的虚函数,否则将无法通过编译。
  • final关键字修饰类或函数,表示该类不能在被继承,或该函数不能再被重载。
  • default关键字希望编译器产生默认构造函数。
  • delete关键字不让编译器产生默认构造函数。

05 强制转换const_cast

链接_视频

  • 强制类型转换(type)vari使存在风险的,如把整型数值转换为指针,把基类指针转换为派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针。
  • c++引入四种功能不同的强制类型转换运算符:const_caststatic_castreinterpret_castdynamic_cast
  • 克服了c语言强制类型转换的三个缺点:
    1 没有从形式上体现转换功能和风险的不同。
    2 将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。
    3 难以在程序中找到到底哪个地方进行了强制类型转换。
  • const_cast仅用于去除const属性的转换,它也是四种强制类型转换运算符中唯一能够去除const属性的运算符。
  • 常量对象或者是基本数据类型不允许转化为非常量对象,只能通过指针,引用或this指针修改。

06 强制转换static_cast

链接_视频

  • 基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方。
  • 可用于低风险的转换:
    1 整型和浮点型
    2 字符与整型
    3 转换运算符
    4 空指针(void* p = nullptr)转换为任何目标类型的指针
  • 不可用于风险高的转换:
    1 不同类型的指针间转换
    2 整型和指针之间的转换
    3 不同类型的引用之间转换

07 强制转换dynamic_cast

链接_视频

  • 用于具有虚函数的基类派生类之间的指针或引用的转换。
  • 基类必须具备虚函数。(why,dynamic_cast运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。
  • 运行时检查,转型不成功则返回一个空指针。
  • 非必要不要使用dynamic_cast,有额外的函数开销
  • 常见的转换方式:
    1 基类指针或引用转派生类指针。(必须使用dynamic_cast
    2 派生类指针或引用转基类指针。(可以使用dynamic_cast,但更推荐使用static_cast
  • 父类转子类(向下转换)是不安全的,子类转父类(向上转换)是安全的。

08 强制转换reinterpret_cast

链接_视频

  • 用于进行各种高危险不同类型的转换:
    1 不同类型指针之间。
    2 不同类型引用之间。
    3 指针和能容纳指针的整数类型之间。
  • 编译器处理,执行是逐字节复制的操作。
  • 类似于显示强转后果自负

09 lambda表达式与匿名函数

链接_视频

  • lamba表达式就是匿名函数。

27 线程与同步

链接_视频

*

  • 版权声明: 本博客所有文章均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2021 Hang Liu
  • Powered by Hexo Theme Ayer
  • PV: UV: