• C++11(一)


    🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
    在这里插入图片描述

    一、列表初始化

    之前呢{}就是对于结构体和数组进行统一地列表初始值设定
    C++11扩大了用大括号括起来地列表初始化的使用范围,使其可对所有的内置类型和用户自定义类型,使用列表初始化时,可添加等号,也可以不加

    strcut Point
    {
    	Point(int x=1,int y=1)
    		:_x(x)
    		,_y(y)
    	{}
      int _x;
      int _y;  
    };
    int main()
    {
    
        int x1=1;
        int x2={3}
        int x3{2};
        
        int array1[]{1,2,3,4,5};//直接就去掉=
        int array2[5]{0};
        
        Point p(1,2);//调用构造函数初始化
        Point p{1,2};
        Point p = {1,2};
        
        //C++11种列表初始化也可以适用于new表达式中
        int*pa =new int[4]{0};
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    initializer_list

    {}并不是运算符,所以说并不是重载{},{}其实是initializer_list

    auto x={1,2,3,4}
    cout<<typeid(x).name();//initializer_list
    
    • 1
    • 2

    其实,初始化列表本来用意是给容器用的

    vector<int> v1={1,2,3,4,5,6};
    vector<int> v2{1,2,3,4,5,6};
    list<int> lt1={1,2,3,4,5,6};
    list<int> lt2{1,2,3,4,5,6};
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    initializer_list也像是一个容器,可以像迭代器一样的去访问,但是initializer_list是一个写死的数组,不支持push_back和pop_back

    在这里插入图片描述
    C++11之后,所以的容器都增加了initializer_list的构造函数。
    那既然initializer_list主要是为容器而产生的,那结构体/类成员为什么也支持呢

    vector<Date> v1={d1,d2,d3};
    vector<Date> v2={{1,2,3},{2,3,4},{3,4,5}};
    
    • 1
    • 2

    同时,initializer_list也能够初始化pair,所以map也能够使用

    二、声明

    1.auto

    auto就是自动推导类型,但是它不能作为参数的类型自动推导

    void func(auto a);//也就是说这是不行的
    
    • 1

    在某些场景下就非常好用,但是也有弊端,auto会降低可读性

    map<string,string>::iterator it = x.begin();
    auto it = x.begin();
    
    • 1
    • 2

    2.decltype

    declare type
    用户声明类型,也可以理解为推导类型

    像我们以前使用的typeid(x).name(),它只能够知道是哪种类型,但是不能够拿这个得到的字符串再去定义对象

    typeid(x).name() y=20;//报错
    //而C++11新增了关键字decltype来解决
    decltype(x) y=20;
    
    • 1
    • 2
    • 3

    3.nullptr

    源码中,有这样一段代码

    #ifdef NULL
    #ifdef __cplusplus//
    #define NULL 0
    #else              
    #define NULL (void*(0))
    #endif           
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    也就是说,在C++中,C的NULL被定义成了字面量0,因为0既能代表常量也能代表地址,由于清晰安全的角度,C++11中有了nullptr,用于表示空指针。

    三、C++11 STL中的变化

    C++11新增容器
    1.unordered_set
    2.unordered_multiset
    3.unordered_map
    4.unordered_multimap
    5.array
    6.forword_list

    1.array

    array相比如vector而言,是一个静态的数组

    template<class T,size_t N/*非类型模板参数*/> class array;
    
    • 1

    为什么有array?
    ①希望数组容器化
    ②C的数组边界问题
    C的数组采用的方式是设岗抽查,只有少量的越界能够查出来,比如开了一个a[10]的数组,可能方式a[15]并不会被检查到。而给一个array,超过非类型模板N,就被查到了,所以array检查严格。

    但是array并没有什么用处
    因为array并不如vector,可以用vector+resize来进行开空间,效率上也得到了保证。而且array是开在栈上的,如果数据量过大,还会栈溢出

    2.forward_list

    forword_list就是单向链表,比起list双向循环链表来说,forword_list优势就只在于节省了一点空间,它只提供了insert_after在末尾插入,所以实际如果没有特殊需求,是不会用forward_list的

    3.STL其他变化

    ①增加initializer_list的初始化化
    ②比较鸡肋的接口cbegin,cend
    ③移动构造和移动赋值(后面说)
    ④右值引用参数的插入
    ⑤手动缩容shrink_to_fit
    等等

    四、C++关键字新功能

    1.defualt强制生成

    Person(Person&&p) = defualt;
    //因为移动构造需要满足条件才自动生成
    //所以这里可以强制生成
    
    • 1
    • 2
    • 3

    2.delete

    delete除了释放资源之外,还有另外的作用
    比如我需要防拷贝

    Person(const Person& p ) =delete;
    Person& operator=(const Person&p) =delete;
    //让编译不准生成
    
    • 1
    • 2
    • 3

    3.final

    ①修饰类,表示最终类
    ②修饰虚函数,表示该虚函数不能被重写

    4.override

    放在函数后面,表示它必须去重写某个父类的虚函数,如果达不到该条件,就进行报错。

    在这里插入图片描述

  • 相关阅读:
    文献速递:深度学习肝脏肿瘤诊断---基于深度学习的表型分类重新划分联合肝细胞胆管癌
    知乎问题:.NET AOT编译后能替代C++吗?
    软件泥潭真体验
    js两数之和
    获取热门电影算法
    设计模式之单例模式
    用实例理解c语言的多参数传递过程
    荣耀推送服务业务介绍
    什么是网络变压器,它是干什么用的?作用/参数表/价格及型号体系有哪些?怎么测量网络变压器好坏
    Java编码规范--OOP规约
  • 原文地址:https://blog.csdn.net/zhu_pi_xx/article/details/128071622