• C++~auto关键字


    目录

    (1).概念

    (2).使用细则

    (3).auto存在的意义(偷懒/范围for)

    (4).auto不能推导的场景


    (1).概念

            使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。

    auto会根据初始化的值来推断当前变量的实际类型。

    1. int main()
    2. {
    3. int a = 5;
    4. auto b = a;
    5. auto c = 'a';
    6. cout << typeid(b).name() << endl;
    7. cout << typeid(c).name() << endl;
    8. }

    会输出int和char


    (2).使用细则

    1.auto与指针和引用结合起来使用

    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

    1. auto a = &x;
    2. auto* b = &x;
    3. auto& c = x;

    注意,声明指针的时候,表达式后面必须是地址,不能是auto* b = x;

    声明引用的时候,auto后面必须加上&

    2. 在同一行定义多个变量

    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同

    实际上编译器auto底层的实现也很简单,还是会将auto替换成int


    (3).auto存在的意义(偷懒/范围for)

    要是auto只像我们之前这样子用的话,没有任何意义,写成int/double和auto没什么区别

    1.之后如果类型很长的时候,懒得写,可以让他自动推导。

    2.在范围for里面用,相比于c++98的遍历要方便很多。这里不写auto写成int也可以。

    c++98里面只有这种遍历的方式,数组没有length(),size()

    vector有size(),string有length(),,数组长度只能通过sizeof(a)/sizeof(元素leixing)来获取

    1. int array[] = { 12345 };
    2. for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
    3. array[i] *= 2;
    1. //范围for
    2. //依次自动取array中的数据,赋值给e..自动判断结束
    3. for (auto e : array)
    4. cout << e << " ";

    这种方式e的改变不会影响数组中的值,想要改变数组中的值需要用引用

    1. for(auto& e : array)
    2. e *= 2;

    范围for的使用条件

    1. for循环迭代的范围必须是确定的

    对于数组而言,就是数组中第一个元素和最后一个元素的范围;

    下面这种方式是错误的。

    1. void TestFor( int array[]) {
    2. for ( auto& e : array)
    3. cout<< e <
    4. }

    c语言规定数组在传参的时候是用指针传递的,此时的array是指针,而不是数组,范围是不确定的。

    下面的方式也是错的,当数组作为参数传入函数的时候,传入的是指针,数组长度是未知的,此时必须再传入一个n表示数组的长度,否则无法遍历数组

    1. void test(int a[]) {
    2. for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
    3. cout << a[i];
    4. }
    5. }

    2. 迭代的对象要实现++和==的操作


    (4).auto不能推导的场景

    1. auto不能作为函数的参数

            auto不能作为形参类型,因为编译器无法对a的实际类型进行推导,只有在调用函数的时候,才会进行传参,在这之前不知道auto类型的话,栈帧的大小,以及给a变量分配空间的大小都不知道,在编译的时候就会报错。

    2. auto不能作为函数的返回值

    3. auto不能用来声明数组

  • 相关阅读:
    Kubernetes CI/CD 实战:5分钟部署你的第一个应用
    2022.9.5-9.11 AI行业周刊(第114期):分享的快乐
    Python3 错误和异常
    Docker 下载redis
    php反序列化靶场php-ser-lib-main 1-9关
    香蕉叶病害数据集
    windows的powershell中apt命令的替换命令
    ib课程北京国际学校哪里有?
    Python进阶复习-文件与异常
    在ROS平台使用扩展卡尔曼融合里程计与IMU传感器
  • 原文地址:https://blog.csdn.net/qq_24016309/article/details/126987944