1.隐形刺客:auto
描述:这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。auto关键字在我们写的代码里几乎看不到,但是它又无处不在,它是如此的重要,又是如此的与世无争,默默的履行着自己的义务,却又隐姓埋名。
作用:C程序是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。例如:
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
整型变量a在fun函数内声明,其作用域为fun函数内,出来fun函数,不能被引用,a变量为自动变量。也就是说编译器会有int a = 10之前会加上auto的关键字。
auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。
2.C++98auto
早在C++98标准中就存在了auto关键字,那时候的作用是让变量变成自动变量,拥有自动的生命周期,但是临时变量在声明的时候本身就是自动生命周期了,所以这显得很多余。
int a =10 ; //拥有自动生命期
auto int b = 20 ;//拥有自动生命期
static int c = 30 ;//延长了生命期
取而代之,C++11就删除了原来的用法,改为了自动推导变量类型。auto 关键字可以用于变量类型的推断,我们可以在声明变量的时候根据变量初始值的类型自动为该变量选择合适的类型,而不需要我们显式指定类型。
3.使用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 关键字不会降低程序的运行效率。
4.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 修饰,而且该变量的值在类内初始化
如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!
【C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习书籍:
编程学习视频: