1. 隐形刺客:自动
说明:该关键字用于声明变量的生存期是自动的,即没有在任何类、结构体、枚举、联合、函数中定义的变量被视为全局变量,在函数中定义的变量被视为作为局部变量。 auto关键字在我们编写的代码中几乎看不见,但它却无处不在。 它如此重要,又如此冷漠,默默地履行自己的义务,却保持匿名。
功能:C程序是面向过程的。 C代码中会有大量的功能模块。 每个函数都有其生命周期(也称为作用域)。 在函数生命周期中声明的变量通常称为局部变量,也称为局部变量。 自动变量。 例如:
int 乐趣(){
整数a = 10; // 自动int a = 10;
// 做
0;
int 乐趣(){
整数a = 10; // 自动int a = 10;
// 做
0;
整型变量a是在fun函数内声明的,其作用域在fun函数内。 当从fun函数出来时,就无法被引用了。 a 变量是自动变量。 也就是说,编译器会在int a = 10之前添加auto关键字。
auto的出现意味着当前变量的作用域是当前函数或代码段的局部变量,也就是说当前变量将分配在内存堆栈上。
2.C++
auto 关键字早在 C++98 标准中就已存在。 当时它的作用就是把变量变成自动变量,并且有自动的生命周期。 然而,临时变量本身在声明时就具有自动生命周期,所以这显得非常多余。
整数a=10; //具有自动生命周期
auto int b = 20;//具有自动生存期
int c = 30;//延长生命周期
相反,C++11删除了原来的用法,改为自动派生变量类型。 auto 关键字可用于变量类型推断。 我们可以在声明变量时根据变量初始值的类型自动为变量选择合适的类型,而不需要我们显式指定类型。
3.使用auto进行类型推断 (1)普通类型推断 auto x = 127; // auto 被推断为 int 类型
自动 y = 3.14; // auto 被推断为类型
auto z;//错误,必须有一个初始值才能推理 (2)引用类型推理 int x = 0, &rx = x;
auto a1 = rx;//使用引用实际上使用了被引用的对象。 此时auto使用引用对象的类型作为auto的类型,所以这里auto被推断为int。
auto &a2 = rx;//此时auto被推断为int类型,a2对象本身就是int &类型
常量自动 &a3 = rx; // auto 被推断为 int 类型,a3 对象本身就是 const int & 类型,rx 引用的对象值不能通过 a3 修改 (3) const 类型的推断 const int c = 10;
自动 a1 = c; // 此时auto为int,顶层const属性被丢弃
auto &a2 = c;//此时auto为const int,保留底层const属性 (4)数组和函数的推断 const char arr[] = "I Love China";
自动 r1 = arr; // 如果将数组名赋值给auto变量,auto推断的结果是指针类型,如果有const属性
// 会被保留,自动推断的结果是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)
自动 &r4 = 添加; // r4为int(&)(int, int)的推理规则描述
① 对于普通类型推断(无const且无引用),直接根据表达式右侧值的类型进行推断。 注意,必须有一个初始值。
② 使用引用进行推理实际上就是使用引用对象的类型进行推理。 此时,参考特征将被丢弃。 如果定义的对象需要成为引用,只需在auto后面添加&即可定义该对象。
③ 使用具有const属性的对象进行推理时,如果定义的对象不是指针或引用,则const属性将被丢弃,否则const属性将被保留。 参见(3)const类型推断
自动关键字描述
auto 自动类型推断发生在编译时,因此使用 auto 关键字不会降低程序的运行效率。
4. auto关键字的使用场景
适用场景
(1)一些书写长度较长的类型可以使用auto来简化,如for(std:::: 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中是允许的
0;
}不适用场景
(1) 函数参数类型不能为auto类型,例如int add(auto a, auto b) { a + b; } 不允许
(2)类的成员变量不能是auto类型。类的静态成员变量可以是auto类型,但需要用const修饰,并且变量的值在类内部初始化。
文章来源:////?=..none-task-blog-word-2&spm=1001.2101.3001.4242