C++11新特性

C++11新特性

语言特性

  1. 移动语义

  2. 右值引用

  3. 转发引用

  4. 可变模板

  5. 列表初始化

    列表初始化,就是使用花括号进行初始化

    std::vector<int> nums{1, 2, 3, 4, 5}; // 列表初始化
    for (auto it : nums){
        cout << it << endl;
    }
    
  6. 静态断言

    编译时断言机制,允许在编译时检查某个条件是否为真。静态编译检查编译时的常量表达式。经常与类型特征type traits一起使用。因为静态断言是在编译时进行检验,所以可以用于不同编译平台进行运行前检验。

    static_assert(<constant-expressions>, <error-message>);
    static_assert(sizeof(int) >= 4, "Not support 32 bits integer");
    template <typename T>
    void CheckInt(T* co, size_t size)
    {
        static_assert(std::is_integral<T>::value, "Not support 32 bits integer.");
    }
    
  7. 类型推导

    auto类型推导的使用,必须前面有可以隐式说明类型的语句。

    std::vector<int> nums;
    for (auto it : nums){
        cout << it << endl;
    }
    
  8. lambda表达式

  9. decltype类型声明

    decltype操作符将会返回传递给它的表达式得到的类型。

    int a = 0;
    decltype(a++) b;
    
  10. 类型别名
    C++using也可以声明别名,相较于typedef更易读。

    template <typename T, typename T>
    using u_map = std::map<T, T>;
    
  11. nullptr空指针

    nullptr空指针的使用可以规避掉以往设置为NULL的风险。NULL在编译器中常常被设置为0或者其它数字,此时判断指针是否为NULL,即判断指针类型是否能够等于整型值,并不安全。

    int* p = nullptr;
    
  12. 强类型枚举

    强类型枚举不能隐式转换为int类型,可以指定底层类型,如果未指定底层类型,会自动默认为int类型。只能通过类型名访问,是因为成员作用域局限在类型中,并不公开。

    // 强类型枚举
    enum class HttpState:uint32_t{
        HTTP_OK, // private
        HTTP_BAD
    };
    using State = HttpState;
    State state = State::HTTP_OK;
    
  13. constexpr声明

    constexpr会告诉编译器在编译时对其进行优化,所以会在编译时即计算完。因此禁止调用运行时才完成的函数(如构造函数)。

    constexpr int Add(int a, int b)
    {
            return a + b;
    }
    int main(){
        int a =3, b = 4;
        const int res = Add(a, b);
        std::cout << res << std::endl;
    }
    
  14. 委托构造

    构造器能够调用其它构造器进行初始化。

    class MyClass{
        MyClass(int a) :val(a){}; // default private
        MyClass() : MyClass(0){};
    private:
        int val;  
    }
    
  15. 用户定义语义

  16. 显式虚重载
    override告知编译器,派生类会覆盖基类中的虚函数,避免发生签名不匹配和不存在相应虚函数。如果出错会报错。

    // explict virtual override
    class Base{
        virtual void Add()=0;
    };
    class Derived final: public Base{
        void Add() override{
            /* code */
        };
    };  
    
  17. Final限定符

    告诉编译器,用于指示一个类不能被进一步继承,或者一个虚函数不能被子类覆盖。

    // final修饰的虚函数无法覆盖
    class Cat{
    public:
        virtual void showCatName() final{ // 限定不能被继承
            /* 显示名字 */
        }
    };
    class MyCat : public Cat{
        void showCatName(){ // 不能继承父类,此时会编译报错
            /* ... */
        }
    }
    // final修饰的类无法继承
    class Base final{
        virtual void Add() = 0;
    };
    
  18. default修饰符

    此修饰符用于告诉编译器为default修饰的函数生成默认函数, noexcept告诉编译器不要抛出异常,避免对象构建过程中抛出异常,假如构造函数抛出异常,其中有一些变量已经生成。那么此时对象无法构建成功,已经生成的变量则无法析构,会导致丢失内存。

    class Myclass{
       Myclass() noexcept = default; // 生成默认配置
    };
    
  19. deleted修饰符

    此修饰符用于告诉编译器不要为delete生成默认的函数,使其无法被实例化和调用。可以完成禁止拷贝、禁止移动等功能。

    class Myclass{
      Myclass() noexcept = delete; // 禁止生成默认配置
    };
    
  20. 范围for循环

    std::vector<int> nums;
    for (auto it : nums){
        cout << it << endl;
    }
    
  21. 移动语义特殊成员函数

  22. 显式转换功能

  23. 内联命名空间

  24. 非静态数据成员初始化

  25. 右角括号

  26. 引用限定成员函数

  27. 尾部返回类型

    允许lambda和函数指定返回类型。

  28. noexcept限定符:限定能否抛出异常

    noexcept关键字告诉编译器该函数不会抛出任何异常,从而允许编译器优化。如果抛出了异常,会用std::terminate终止程序运行。可以省略一些编译器生成一些异常处理代码。可以是条件性判断抛出异常。

    void Add(int a, int b) noexcept{
        // 不会抛出任何异常
    }
    void AddIf(int a, int b) noexcept(false){
        // 可能会抛出异常
    }
    
  29. char32_t char16_t代表UTF-8字符串(1-4个字节)

  30. 原始字面字符串

库特性

  1. std::move

  2. std::forward

  3. std::thread

    thread是引入的线程库。

  4. std::to_string()

    to_string能够完成的作用是将数字转换为字符串。stoi()函数将字符转为数字,一定要注意提前检查字符一定是数字,而不是数字意外的其它字符,否则会程序崩溃。

  5. type_traits类型特性库

    类型特性库包含了一组编译时检查类型特性的工具,可以配合static_assert使用。

    // 基本类型判断包括整型、浮点型等
    std::is_integral<T>::value // 检查T是否是整数类型,value是一个静态常量,其值为true或false
    // 类型修饰
    std::remove_const<T> // 移除类型T的const修饰
    // 类型转换
    std::add_const<T> // 为类型T添加const修饰
    // 类型特性检查
    std::is_same<T, U> // 检查两个类型是否相同
    // 条件类型
    std::conditional<Condition, T, F> // Condition为true, 则类型为T,否则为F
    
  6. 智能指针

    智能指针有三种,share_ptr共享指针,用于多个读;weak_ptr弱指针,解决共享指针循环引用计数无法下降问题; unique_ptr独占指针,用于独享资源。

  7. std::chrono

    chrono是引入的一个定时器相关的库,有system_clock

  8. turples

  9. std::tie绑定

  10. std::array

    数组容器,有强制类型检查,连续存储可以告诉访问,可以用于存储特定个数元素。vector是可以扩容的。

    std::array<int> intArray{1, 2, 3, 4, 5};
    
  11. unordered containers

  12. std::make_shared

  13. std::ref

  14. std::async

  15. std::begin()std::end()

    这两个函数用于获取对象的迭代器,begin(string str) 等价于str.begin()