当前位置:网站首页 > 编程语言 > 正文

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



自动类型推断(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可以说明全局变量吗为什么)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • mt102报文(mt210报文用途)2025-06-20 11:18:07
  • ewm焊机是什么品牌(ew是什么焊接)2025-06-20 11:18:07
  • 开源代码网站gitee(开源代码网站婚恋app)2025-06-20 11:18:07
  • 接口400什么原因(接口400是什么错误)2025-06-20 11:18:07
  • 密码库(密码库黄在哪里)2025-06-20 11:18:07
  • 怎么用手机steam扫码支付(手机steam怎么扫二维码)2025-06-20 11:18:07
  • 验证码发送失败原因(验证码发送失败的原因)2025-06-20 11:18:07
  • 安卓运行xp虚拟机(安卓运行虚拟win xp)2025-06-20 11:18:07
  • seat-tend翻译(seating翻译)2025-06-20 11:18:07
  • modbus报文解析在线工具(modbus报文怎么看)2025-06-20 11:18:07
  • 全屏图片