自动类型推断(Automatic Type Inference)是指编程语言在编译时自动根据上下文推导变量的类型,而无需显式指定变量的类型。
在C++ 11中,自动类型推断是通过关键字来实现的。
大多数情况下,我们都是使用auto声明定义局部变量的,形式如下所示:
除上例之外,
结论:
- 当变量是指针或引用类型时,auto推导结果会保留const、volatile属性
- 当变量不是指针或引用类型时,auto推导结果中不会保留const、volatile属性
在这里,对字符串类型变量需要说明一下,因为使用字符串初始化的auto类型变量,通常会被推导成const char *类型。但是有时候我们还想让auto类型推导成std::string类型,那么只需要初始化的字符串的末尾追加s符号标注即可,如下:
使用的auto声明定义的局部变量,经常被使用在基于范围的 for 循环中遍历容器、数组等当中的元素,如下:
关于此用法的详细说明,请参考
C++中,全局变量分为两种:外部全局变量和静态局部变量。
1.2.1 外部全局变量
C++中,为了避免在不同的源文件中出现重复定义的问题,外部全局变量会被声明为extern,然后实现在另一个文件中进行定义实现。
在C++ 11中,外部全局变量是不能被定义成auto类型的。如下定义会在编译期间报错的。
1.2.2 静态全局变量
我们再说说静态全局变量,它是指在一个文件中定义的全局变量,是由static定义的变量。它的生命周期会持续到程序的结束,并且只能在当前文件中访问。
在C++ 11中,静态全局变量是可以定义成auto类型的。在编译期间,它的类型会根据给定的初始值推导出真正的类型。如下示例:
C++中,类成员变量分为两种:静态成员变量和非静态成员变量。
1.3.1 静态成员变量
由于类的静态成员变量在声明定义时,不能给定一个初始值,无法推导出类型,所以它无法被定义成auto类型。如下示例:
1.3.2 非静态成员变量
对于非静态成员变量,由于能够给定初始值,我本认为是可以使用auto关键来进行声明定义的,但是事实上非静态成员变量被声明auto类型后,编译阶段就会报错。所以所以它无法被定义成auto类型。如下示例:
1.3.3 静态常量
在类中,虽然无论是静态成员变量或是非静态成员变量都不能被定义成auto类型,但是类的静态常量确是可以使用auto来声明定义的。需要注意,一般情况下,使用const关键字只能声明定义 int 类型的常量,若想定义声明其它类型的静态常量时,可使用C++ 11新引入的 constexpr 关键字来定义声明。如下所示:
在C++ 11中,无论是函数的返回值还是函数参数都是不能被定义成auto类型的,但从C++ 14后就支持了这种特性。
从C++ 14后,对于任何函数及类中的成员函数的返回值都可定义成auto类型,但是对类中的虚函数(virtual定义)的返回值是不能够使用auto类型的。
在C++ 14中,关于函数auto类型返回值的推导,我们经常会遇到以下几种情况:
- 返回数据的类型一致
编译成功,输出结果:
- 返回数据的类型不一致
编译成功,输出结果:
但是,我发现一个很奇怪的问题,如果将上例函数中的三目运算符修改成使用 if 语句检查判断,用多个return语句返回不同类型的数据时,就会发生编译错误。如下:
如何解决这种问题呢?可以直接使用三目运算符解决,也可以使用“后置返回值类型”声明返回值的类型。如下:
编译成功,输出结果:
在C++14中引入的“泛型Lambda表达式”,它可以将参数声明定义成auto类型,实现函数参数类型的自动推导。如下示例:
3.1.1 简化变量类型的声明
使用auto可以省去手动指定变量类型的麻烦。编译器会根据初始化表达式的类型来推断出变量的类型,使代码更简洁。
特别适用于处理复杂或模板化的类型,因为它消除了在代码中显式声明冗长或冗余类型名称的需要。例如:
使用auto声明后:
3.1.2 支持复杂类型的推断
auto可以推断复杂的类型,例如模板类型、迭代器类型和lambda表达式类型。
3.1.3 提高代码的灵活性和重构能力
使用auto可以避免重复修改变量声明的类型,尤其是在复杂的类型改变时。这样可以提高代码的重构能力和可维护性。
尤其在使用auto定义泛型的时候,大大提高了代码灵活性和使用上的复杂性,例如不使用auto的情况下,定义一个模板:
在使用auto的情况下,代码可以修改成以下样式:
在使用C++ 11 auto关键字声明定义的时修,也是有制限的。
- 不能用于作为函数参数的声明
- 不能用于类中静态常量之外的变量的声明
- 不能用于定义数组
- 不能用于推导出模板参数
总而言之,auto是C++ 11引入的功能之一,它可以帮助简化代码、减少冗余,并提高编写和维护代码的效率。
到此这篇auto可以说明全局变量吗(auto可以说明全局变量吗为什么)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/33790.html