• c++11:新特性(1-10)


    一:nullptr 

    空指针的定义:

    1. int* p = nullptr;
    2. int* p1 = NULL;
    3. int* p2 = 0;

    这3种方式都能把指针弄为空

    对指针直接赋值是错误的

    1. int* p;
    2. int a = 0;
    3. *p = a;//不能直接对指针赋值

    NULL的方法是:

    #define  NULL  0   使用的是预处理

    在文件#include<cstdlib>

    nullptr 是c++新有的生成的空指针的方法: 

    nullptr 相当于常量

     二:constexpr

    constexpr来验证变量的值是否是常量表达式

    声明为constexpr的变量一定是一个常量,而且必须要常量表达式初始化。

     constexpr函数使用上的一些细节:

    无参数函数初始化时:

    1. constexpr int PN(){return 10;}
    2. int main()
    3. {
    4. constexpr int k = PN();//用一个constexpr无参数函数初始化
    5. return 0;
    6. }

    执行该初始化时,编译器把对constexpr函数的调用替换成结果值,为了在编译时能够展开,constexpr函数隐式的指定为内联函数。

     有参函数初始化时:

    constexpr不一定返回常量值:

    • 当函数传一个常量时,返回值为常量
    • 当函数传一个变量时,返回值为变量 
    1. //constexpr有参函数
    2. constexpr int PN(int a)
    3. {
    4. return a;
    5. }
    6. int main()
    7. {
    8. //用一个constexpr有参函数初始化时,必须用一个常量来初始化
    9. constexpr int k = PN(1);
    10. int p=10;
    11. constexpr int k = PN(p);//报错:p为变量不能初始化constexpr
    12. int a=PN(p);
    13. return 0;
    14. }

    constexpr构造函数:

    构造函数不能为const,但可以为constexpr。

    • constexpr构造函数可以声明成=default或者删除形式。
    • constexpr构造函数体一般为空
    • constexpr构造函数必须初始化所有数据成员
    1. class RET
    2. {
    3. public:
    4. constexpr RET(int x,double y,char z):a(x),b(y),c(z){}
    5. //RET(int x, double y, char z):a(x),b(y),c(z){}
    6. int a;
    7. double b;
    8. char c;
    9. };
    10. int main()
    11. {
    12. //生成一个constexpr对象
    13. constexpr RET k(10,20.0,'p');
    14. return 0;
    15. }

     三:类型别名 

    typedef 起别名的格式 :

     typedef   数据类型    别名

    using 起别名的格式: 

    using  别名=数据类型

    1. typedef int p;//原有的起别名的方法
    2. using g= char;//c++11新有的

     四:类内初始化

    c++11支持在类内初始化:

    初始化时不能使用圆括号

    1. class p
    2. {
    3. public:
    4. int a = 0;
    5. int* p = nullptr;
    6. double k = 10.0;
    7. int a[10] = {0};
    8. int b(10);//报错
    9. };

     

    五:for的新用法

    在C++11中,for循环有了一种新格式

    1. for(变量 : 对象)//变量接收对象的值,但无法修改,只是可读
    2. {
    3. }

    在数据类型后加&,这样的化可读可修改 

    1. for (auto& i : p)
    2. {
    3. }
    1. vector<int>p;
    2. p.push_back(5);
    3. p.push_back(7);
    4. p.push_back(9);
    5. p.push_back(4);
    6. p.push_back(3);
    7. for (int i : p)
    8. {
    9. cout << i << endl;
    10. }

    六:begin()和end()标准函数

     begin()和end()标准函数,和容器中的 begin()和end()不同,但作用相似。

     begin()和end()标准函数:

    用法:begin(对象)    end(对象)

    1. int a[10] = { 1,2,3,4,5,6,7 };
    2. int* n = begin(a);//指向第一个元素地址
    3. int* m = end(a);//指向最后一个元素的下一个元素

     容器中的 begin()和end():

    用法: 对象.begin()   对象.end()

    1. vector<int>p{4,5,2,3,7};
    2. vector<int>::iterator P = p.begin();//迭代器指向第一个元素
    3. vector<int>::iterator P1 = p.end();//迭代器指向最后一个元素的下一个元素

    七:含有可变形参的函数initislizer_list

    initislizer_list是一种标准库类型,用于表示特定类型的值的数组

    头文件为:#include

    常用的函数:

    • size()   元素个数
    • begin() 首元素指针
    • end()    尾元素的下一个位置

     initislizer_list的用法类似于vector,但initislizer_list存储的是常量值,无法修改。

    1. int main()
    2. {
    3. initializer_list<int>p{ 1,2,3,4,5 };
    4. auto n = p.begin();//类型为const int*
    5. auto m = p.end();
    6. while (n != m)
    7. {
    8. cout << *n <<" ";
    9. n++;
    10. }
    11. return 0;
    12. }

     

     八:列表初始化返回值

    c++11规定,函数可以返回花括号包围的值的列表。

    数据类型: 

    • 普通类型:只能返回一个值
    • 类:成员变量有多少个,就可以返回多少个
    • 容器:可以返回多个,可以用于初始化
    1. //普通类型
    2. int text()
    3. {
    4. return { 1 };
    5. }
    6. //
    7. class person1
    8. {
    9. public:
    10. int a;
    11. int b;
    12. person1(int i,int j):a(i),b(j){}
    13. };
    14. person1 text1()
    15. {
    16. return { 10,20 };//类里有多少个变量,就可以返回多少个
    17. }
    18. //容器
    19. vector<int> text2()
    20. {
    21. return{1,2,3,4,5};//容器可以返回多个,可以用于初始化
    22. }
    23. int main()
    24. {
    25. vector<int>p(text2());//初始化
    26. return 0;
    27. }

    九:=default的含义

    在C++11中,如果需要默认行为,可以通过在参数列表后写上=default,要求编译器生成构造函数

    =default在类中的位置:

    • 在类中: 默认构造函数为内联函数
    • 在类外:默认构造函数不为内联函数
    1. class son
    2. {
    3. public:
    4. son() = default;//默认为内联函数
    5. };
    6. class per
    7. {
    8. public:
    9. per();
    10. };
    11. per::per() = default;//类外定义,默认不为内联函数

     十:类数据成员的初始化

    在C++11中,类开始需要默认值,则把默认值设置为一个类内初始化值。

    1. class PK
    2. {
    3. public:
    4. PK(int a,int b){}
    5. int a;
    6. int b;
    7. };
    8. class K
    9. {
    10. public:
    11. vector P = { PK(1,2) };//在{}内调用构造函数
    12. };

    在提供一个类内初始值时,必须使用=或则花括号表示。

  • 相关阅读:
    spring容器
    java计算机毕业设计家庭安防系统源码+mysql数据库+系统+lw文档+部署
    老知识复盘-SQL从提交到执行到底经历了什么 | 京东云技术团队
    你在终端启动的进程,最后都是什么下场?(上)
    kerberos认证相关概念和流程
    剑指 Offer II 062. 实现前缀树
    vscode 快速生成标准javabean
    【干货】安全应用RPA的3个阶段
    杂记:数据库go,begin,end,for,after,instead of
    【毕业设计】图像识别垃圾分类系统 - python 深度学习
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127502515