auto关键字的作用

1.前言

        在 C 语言以及 C++98 时代,auto 关键字的作用并不大,仅用于声明变量是自动类型的变量,具有自动存储期,这种类型的变量在进入变量声明的程序块中才被建立,程序退出程序块时该变量就被撤销,在函数内部定义的变量具有自动变量的属性。

void func() 
{
    int num = 0;        // num 就是一个自动类型的变量,实际上等同于 auto int num = 0;
}

而到了 C++11 时代,auto 关键字可以用于变量类型的推断,我们可以在声明变量的时候根据变量初始值的类型自动为该变量选择合适的类型,而不需要我们显式指定类型。

2.使用auto进行类型推断

(1)普通类型的推断

auto x = 127;               // auto 被推断为 int 类型

auto y = 3.14;              // auto 被推断为 double 类型

auto z;                         // 错误,必须有初始值才能进行推断

(2)引用类型推断

int x = 0, &rx = x; 

auto a1 = rx;               // 使用引用其实是使用引用的对象,此时 auto 以引用对象的类型作为 auto 的类型,所以 auto 这里被推断为 int 

auto &a2 = rx;            // 此时 auto 被推断为 int 类型,a2 对象本身就是 int & 类型

const auto &a3 = rx;  // auto 被推断为 int 类型,a3 对象本身是 const int & 类型,不能通过 a3 去修改 rx 引用的对象值

(3)const类型的推断

const int c = 10;

auto a1 = c;            // auto 此时是 int,顶层 const 属性被丢弃

auto &a2 = c;         // auto 此时是 const int,底层 const 属性保留

(4)针对数组和函数的推断

const char arr[] = "I Love China";

auto r1 = arr;                                        // 如果将数组名赋值给 auto 变量,那么 auto 推断的结果是指针类型,如果有 const 属性

                                                             // 会被保留,auto 推断的结果是 const char *,r1 为 const char *

auto &r2 = arr;                                      // 如果将数组名赋值给 auto & 变量,auto & 变量的类型是一个数组引用类型,即为

                                                             // const char (&) [14] 

int add(int a,int b);                                // 函数声明

auto r3 = add;                                      // r3 为 int(*)(int, int)

auto &r4 = add;                                    // r4 为 int(&)(int, int)

推断规则说明

① 对于普通类型推断(没有 const 也不掺杂引用的),直接根据表达式右边值的类型进行推断,注意必须有初始值

② 使用引用进行推断,实际上就是使用引用对象的类型进行推断,此时引用特性会被丢弃,如果定义的对象需要成为引用,就自己在 auto 后面加上 & 来定义对象

③ 使用带有 const 属性的对象进行推断时,如果定义的对象不是指针或者引用,则 const 属性会被丢弃,否则 const 属性会保留,见 (3) const 类型的推断

auto关键字说明

auto 自动类型推断发生在编译期,所以使用 auto 关键字不会降低程序的运行效率

3.auto关键字使用的场景

适用的场景

(1) 一些类型长度书写很长的,可以使用 auto 来简化,如 for(std::vector<int>::iterator it = v.begin();it != v.end();++it),如果使用 auto 可以直接写为 for(auto it = v.begin();it != v.end();++it)

(2) 当函数返回的值不确定时,可以使用 auto 做返回值类型,更加方便,编译器会根据返回值的类型推断 auto 的类型,这种语法是在 C++14 才出现的。

auto func()        // 这种写法在 C++14 是允许的
{
    return 0;
}

不适用的场景

(1) 函数参数类型不能是 auto 类型,比如 int add(auto a, auto b) { return a + b; } 是不允许的

(2) 类的成员变量不可以是 auto 类型。类的静态成员变量可以是 auto 类型的,但是需要使用 const 修饰,而且该变量的值在类内初始化

  • 22
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椛茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值