2025年auto可以说明全局变量吗(auto可以说明全局变量吗为什么)

auto可以说明全局变量吗(auto可以说明全局变量吗为什么)p id main toc 自动类型推断 Automatic Type Inference 是指编程语言在编译时自动根据上下文推导变量的类型 而无需显式指定变量的类型 p 在 C 11 中 自动类型推断是通过关键字来实现的

大家好,我是讯享网,很高兴认识大家。



 <p id="main-toc">自动类型推断&#xff08;Automatic Type Inference&#xff09;是指编程语言在编译时自动根据上下文推导变量的类型&#xff0c;而无需显式指定变量的类型。</p> 

讯享网

在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引入的功能之一,它可以帮助简化代码、减少冗余,并提高编写和维护代码的效率。

小讯
上一篇 2025-05-25 10:32
下一篇 2025-05-31 09:24

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/141435.html