auto关键字(C++11)

news2024/11/15 21:45:15

auto关键字(C++11)


文章目录

  • auto关键字(C++11)
  • 前言
  • 一、auto使用规则
  • 二、auto不适用的场景
  • 三、auto推荐适用的场景
  • 总结


前言

在C++11中,auto关键字能够自动推导出变量的实际类型,可以帮助我们写出更加简洁、现代的代码。


一、auto使用规则

  1. C++中auto关键字并不代表一种实际的数据类型,只是一个类型声明的"占位符",auto的使用场景也有限制,并不是万能的,使用auto声明的变量必须进行初始化,只有这样才能让编译器根据初始化的值推导出变量的实际数据类型,在编译时将auto占位符替换成真正的数据类型。
  2. auto还可以跟指针和引用结合起来,搭配上const、volatile限定符,在不同的场景有对应的推导规则,规则内容如下:
    当变量不是指针或者引用类型时,推导的结果中不会保留const、volatile关键字;当变量是指针或者引用类型时,推导的结果中会保留const、volatile关键字

语法如下:

// var--变量名;value--变量值
auto var=value;

示例程序:

#include <iostream>
using namespace std;

int main()
{
	// 无const修饰
	auto var = 3.14;
	auto var1 = 100;
	auto var2 = 'z';
	auto var3;	//错误❌,使用auto关键字必须初始化
	
	return 0;
}

result
鼠标放在变量上会自动显示编译器推导出的数据类型。
指针和引用的auto推导示例代码:

#include <iostream>
using namespace std;

int main()
{
	// 带指针和引用的auto使用
	int var = 100;

	//&var:int*	; auto:int
	auto* var1 = &var;
	//var:int	; auto:int
	auto& var2 = var;
	//&var:int*	; auto:int*
	auto var3 = &var;
	//var:int	; auto:int
	auto var4 = var;

	// auto在const情况下的使用
	//var:int	; auto:int	; var5:const int
	const auto var5 = var;
	//var5:const int	; auto:int	; var6:int
	auto var6 = var5;
	//var:int	; auto:int	; var7:const int
	const auto& var7 = var;
	//var7:const int	; auto:const int	; var8:const int
	auto& var8 = var7;
	//var7:const int	; auto:const int	; var9:const int*
	auto* var9 = &var7;
	
	return 0;
}

备注:
指针常量和常量指针的区别:
指针常量(int* const):指针的指向不可以改变,指针指向的值可以改变。
常量指针(const int*):指针的指向可以改变,指针指向的值不可以改变。
可以通过这一句话记忆,指针常量,即指针是常量;常量指针,即常量的指针。

二、auto不适用的场景

  1. 不能用于函数的形参数据类型的推导。因为函数的形参的初始化只有在函数被调用时才会被传递实参,因此二者矛盾。
void fun(auto a)	//错误❌
{
	cout<<a<<endl;
}
  1. 不能用于类的非静态常量变量的初始化。因为类的非静态成员(不属于类,属于类对象的)的初始化只有在类创建对象时才会成立,另外静态非常量成员的初始化要在类外实现,因此auto都不可以用来推导这两种类型的推导。
class Test {
	auto var = 0;					//错误
	static auto var1 = 100;			//错误,类的静态非常量成员的初始化不允许在类的内部
	static const auto var2 = 200;	//类的静态常量成员初始化可以在类的内部完成
};
  1. 不能用auto关键字定义数组
int main()
{
	int array[] = { 1,2,3,4 };	//定义数组
	auto var = array;			//auto:int *
	auto var1[] = array;		//错误❌,auto不能用来定义数组
	auto var2[] = { 1,2,3,4 };	//错误❌,auto不能用来定义数组

	return 0;
}
  1. 无法使用auto推导出模板参数类型
template<class T>
class Test {
	T t;
};


int main()
{
	Test<double> t;
	Test<auto> t1 = t;	//错误❌,auto无法推导出类模板类型

	return 0;
}

三、auto推荐适用的场景

  1. 用于STL容器的遍历
#include <iostream>
#include <vector>
using namespace std;


int main()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);

	//STL容器遍历
	//vector<int>::iterator it=vec.begin();
	auto it = vec.begin();		//auto自动推导迭代器类型,代码简洁
	for (; it < vec.end(); it++)
	{
		cout << *it << endl;
	}

	return 0;
}
  1. 用于接收模板函数的返回值
#include <iostream>
#include <vector>
using namespace std;

class Test
{
public:
	static int get()
	{
		return 10;
	}
};

class Test1
{
public:
	static string get()
	{
		return "hello world";
	}
};


template <class T>
void func()
{
	auto ret=T::get();
	cout << ret << endl;
}



int main()
{
	func<Test>();
	func<Test1>();

	return 0;
}

总结

本文主要介绍了auto的使用、带指针和引用的auto的使用以及注意事项、推荐使用的场景,欢迎有问题交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发公众号自定义菜单之创建菜单

文章目录 申请测试账号换取Token接口测试提交自定义菜单查看效果校验菜单配置清空菜单配置结束语 申请测试账号 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index 或 得到appid和secret 换取Token 使用appid和secret换取token令牌…

Python应用实战,用动画生成冒泡排序的过程

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#x…

解决文件夹打开出错问题:原因、数据恢复与预防措施

在我们日常使用电脑或移动设备时&#xff0c;有时会遇到一个非常棘手的问题——文件夹打开出错。这种错误可能会让您无法访问重要的文件和数据&#xff0c;给工作和生活带来极大的不便。本文将带您深入了解文件夹打开出错的原因&#xff0c;并提供有效的数据恢复方案&#xff0…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈…

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

QML的Image 路径问题(source)

四种路径格式 在 QML 中&#xff0c;当你使用 Image 元素的 source 属性来指定一个图片的路径时&#xff0c;有几种不同的方式可以指定这个路径&#xff0c;每种方式都有其特定的用途和上下文。 相对路径&#xff1a; QML 文件和一个名为 close.png 的图片在同一目录下&#x…

列表元素添加的艺术:从单一到批量

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、向列表中添加单一元素 1. append方法 2. insert方法 三、向列表中添加批量…

CentOS网络配置(三种网络模式:桥接、NAT、Host-Only)

目录 1、虚拟机网络模式 1.1 桥接 1.2 NAT 1.3 Host-Only 2、桥接模式 3、仅主机模式 4、NAT模式 5、centos网络配置 5、virtualbox 下centos7网络配置 5.1管理 ——> 全局设定 ——> 网络&#xff0c;新加网络 5.2 具体虚拟机设置&#xff0c;网络设置&#…

软件设计师笔记2

文章目录 软考知识点总结1. 计算机组成原理网络与信息安全数据结构与算法AOE网 编译原理操作系统软件设计软件测试数据库计算机软件产权其它 软考知识点总结 1. 计算机组成原理 cpu控制器&#xff0c;专门产生指令操作&#xff0c;送到计算机各个部位执行处理 DMA&#xff08…

python调用阿里云通义千问(q-wen-max)API-只能总结pdf文档内容

文章目录 通义千问插件PDF解析插件调用案例通义千问插件 Dashscope插件功能能够使得大模型的生成内容与外部三方应用结合,使得模型生成的内容更加准确和丰富,模型将拥有更好的生成能力。您也可以通过开发自定义插件,来使得模型生成更符合您预期的结果。 使用插件功能,大模…

第十三节:带你梳理Vue2 : watch侦听器

官方解释:> 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式&#xff0c;用一个函数取代<br/>## 1. 侦听器的基本使用侦听器可以监听data对象属性或者计算属性的变化watch是观察属性的…

细粒度图像分类论文(AAM模型方法)阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.…

VScode解决报错“Remote-SSH XHR failed无法访问远程服务器“的方案

VScode解决报错"Remote-SSH XHR failed无法访问远程服务器"的方案 $ ls ~/.vscode-server/bin 2ccd690cbff1569e4a83d7c43d45101f817401dc稳定版下载链接&#xff1a;https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/stable 内测版下载链接…

ABAQUS应用07-实现拉伸和压缩刚度不同的弹簧建模

文章目录 0、背景描述1、步骤 0、背景描述 到目前为止&#xff0c;本文的内容我还没有具体实践过&#xff0c;但是个人认为后期是会用到的。比如说&#xff0c;对于风电机组地基转动刚度的设置&#xff0c;土体就是一种拉压刚度并不相同的材料。所以现在先记录下来&#xff0c…

如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?

简介 ArkUI是一套UI开发框架&#xff0c;提供了开发者进行应用UI开发时所需具备的能力。随着OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;不断更新迭代&#xff0c;ArkUI也提供了很多新的组件&#xff0c;例如Canvas、OffscreenCanvas、XComponent组…

Git Large File Storage (LFS) 的安装与使用

Git Large File Storage [LFS] 的安装与使用 1. An open source Git extension for versioning large files2. Installing on Linux using packagecloud3. Getting StartedReferences 1. An open source Git extension for versioning large files https://git-lfs.com/ Git …

手把手从0到1教你做STM32+FreeRTOS智能家居--第10篇之ASR-PRO语音识别模块

前言 先看实验效果&#xff0c;通过ASR-PRO语音智能识别控制模块&#xff0c;来控制STM32单片机实现对应的控制功能。因为后台好多小伙伴私信问用的是什么语音模块&#xff0c;并且很少在网上看到如何使用此模块相关的文章&#xff0c;所以我将会在本篇文章详细介绍一下此模块…

列表和元组

2.1序列概述 列表和元组的主要不同在于&#xff0c;列表是可以修改的&#xff0c;而元组不可以。这意味着列表适用于需 要中途添加元素的情形&#xff0c;而元组适用于出于某种考虑需要禁止修改序列的情形。 Python支持一种数据结构的基本概念&#xff0c;名为容器&#xff0…

Gradle筑基——Gradle Maven仓库管理

基础概念&#xff1a; 1.POM pom:全名Project Object Model 项目对象模型&#xff0c;用来描述当前maven项目发布模块的基础信息 pom主要节点信息如下&#xff1a; 配置描述举例&#xff08;com.android.tools.build:gradle:4.1.1&#xff09;groupId组织 / 公司的名称com.…

clone方法总结Java

Java中Object类当中有许多方法&#xff0c;如图所示&#xff1a; clone方法就是其中一种&#xff0c;分为浅拷贝&#xff0c;深拷贝举一个例子&#xff1a; 浅拷贝&#xff1a; 在Person类当中右键鼠标然后&#xff0c;选中Generate&#xff1a; 然后重写clone方法 protecte…