auto关键字(C++11)

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.mfbz.cn/a/645600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java8新特性——函数式编程详解

目录 一 概述1.1 背景1.2 函数式编程的意义1.3 函数式编程的发展 Lambda表达式1.1 介绍1.2 使用Lambda的好处1.3 Lambda方法1.3.1 Lambda表达式结构1.3.2 Lambda表达式的特征 1.4 Lambda的使用1.4.1 定义函数式接口1.4.2 Lambda表达式实现函数式接口1.4.3 简化Lambda表达式1.4.…

k8s devops实战教程+生产实践+可就业

k8s devops实战教程 简介教程涉及到内容教程获取学习教程后的收货助学群 简介 越来越多的企业应用云原生化&#xff0c;催生很多应用的部署方式也发生了很多变化。 从物理机部署应用过度到虚机部署应用再到应用容器化&#xff0c;从单应用再到服务拆分为微服务&#xff0c;靠人…

【手把手搓组件库】从零开始实现Element Plus--组件开发

从零开始实现Element Plus--组件开发 nvmnvm的作用&#xff1a;nvm的使用方法 需求分析提示词Kimi 生成产品需求文档kimi 生成测试用例 初始化 vitest完善 Button 组件1、定义 types.ts2、Button.vue 引入 types.ts3、添加Button样式点击事件 添加节流添加 Icon 集成 StoryBook…

红黑树封装map和set

红黑树源代码 我们将由下列的KV模型红黑树来模拟封装STL库中的map和set 注意&#xff1a;为了实现封装map和set&#xff0c;我们需要对下列源码进行优化。 #pragma once #include<iostream> using namespace std; //枚举类型的颜色分类 enum Colour {RED,BLACK };//定…

Collection

Collection是单列集合的祖宗接口&#xff0c;它的功能是全部单列集合都可以继承使用。 1.添加元素 public class test {public static void main(String [] args) {Collection<String> colnew ArrayList<>();col.add("aaa");col.add("bbb");…

多签名钱包

相交于硬件钱包的物理上丢失和密钥遗忘&#xff0c;多签名钱包在保证安全不易被破解的基础上&#xff0c;解决了部分密钥丢失的问题。 相比于BTC之前讲到的脚本钱包&#xff08;BTC—脚本&#xff09;&#xff0c;ETH的多签钱包设计可以通过智能合约来实现 设计思路 工作原理…

辐射度技术在AI去衣中的魅力与科学

引言&#xff1a; 在当今的数字化时代&#xff0c;人工智能正逐渐渗透到我们生活的方方面面。其中&#xff0c;AI去衣技术作为一项颇具争议但又不失其科技创新的应用&#xff0c;正引起越来越多的关注和讨论。而在实现高质量图像渲染的过程中&#xff0c;辐射度技术凭借其卓越的…

移动端开发 笔记01

目录 01 移动端的概述 02 移动端的视口标签 03 开发中的二倍图 04 流式布局 05 弹性盒子布局 01 移动端的概述 移动端包括:手机 平板 便携式设备 目前主流的移动端开发: 安卓设备 IOS设备 只要移动端支持浏览器 那么就可以使用浏览器开发移动端项目 开发移动端 使用…

GNSS中的多路径效应原理及计算方法

1 多路径效应原理 图1 多路径效应原理图 2 计算方法 如需原文&#xff0c;可加多源融合定位与智能控制讨论群获取,QQ群号&#xff1a;51885949

6、phpjm混淆解密和php反序列化

题目&#xff1a;青少年雏形系统 1、打开链接也是一个登入面板 2、尝试了sqlmap没头绪 3、尝试御剑&#xff0c;发现一个www.zip 4、下载打开&#xff0c;有一个php文件打开有一段phpjm混淆加密 5、使用手工解混淆 具体解法链接&#xff1a;奇安信攻防社区-phpjm混淆解密浅谈…

页面<html>上多了一个滚动条,定位发现是<body>里面多了一个id为trans-tooltip的div

现象分析&#xff1a; 页面根标签html多了一个滚动条&#xff0c;发现body里面多了一个id为trans-tooltip的div&#xff0c;虽然width为0&#xff0c;height为0&#xff0c;但是其子元素还是有高度&#xff0c;占据了空间&#xff0c;最终导致了滚动条&#xff1b; 根本原因&…

SpringBoot注解--09--idea创建spring boot项目,java版本只能选择17和21

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 idea创建spring boot项目1.问题描述2.原因3.解决方法方案一&#xff1a;升级JDK版本至17或更高方案二&#xff1a;替换Spring初始化的源https://start.aliyun.com i…

可以在搜索结果中屏蔽指定网站的插件

可以在搜索结果中屏蔽指定网站的插件 | LogDict背景 在搜索引擎中搜索问题, 往往充斥各种无效内容 比如搜个技术类的问题, 前几页CSDN, 百度百家号, 百度经验, 百度知道, 腾讯云各类云爬的水文 CSDN基本都是复制粘贴的, 甚至格式都乱码了, 虽然我以前也干过 要复制粘贴无所谓, …

最小二乘法-超详细推导(转换为矩阵乘法推导,矩阵求导推导)

最小二乘法就是让均方误差最小。 下面是损失函数转换为矩阵方式的详解 如何让其最小&#xff0c;在导数为0的地方取极小值。 问&#xff1a;导数为0的地方可能去极大值&#xff0c;也可能是极小值&#xff0c;凭什么说导数为0就是极小值&#xff1f; 答&#xff1a;因为使用…

Linux 生产跑批脚本解读

1.查看定时任务 2.脚本-目录结构 1&#xff09;config.ini 2&#xff09;run.sh 3.命令解读 1&#xff09;ls -1 路径文件夹 含义&#xff1a;ls -1 /home/oracle/shell/config/ 将文件夹config内的文件全部列出 [oracleneptune config]$ ls -1 /home/oracle/shel…

【ROS机器人学习】--------1ROS工作空间和功能包创建

虚拟机工具和镜像链接: https://pan.baidu.com/s/1HDmpbMESiUA2nj3qFVyFcw?pwd8686 提取码: 8686 ROS工作空间是一个用于组织和管理ROS&#xff08;机器人操作系统&#xff09;包的目录结构&#xff0c;它通常包含多个子目录&#xff0c;用于存放源码、构建文件和安装文件。工…

Elastic Cloud 将 Elasticsearch 向量数据库优化配置文件添加到 Microsoft Azure

作者&#xff1a;来自 Elastic Serena Chou, Jeff Vestal, Yuvraj Gupta 今天&#xff0c;我们很高兴地宣布&#xff0c;我们的 Elastic Cloud Vector Search 优化硬件配置文件现已可供 Elastic Cloud on Microsoft Azure 用户使用。 此硬件配置文件针对使用 Elasticsearch 作…

CSS单位px、rem、em、vw、vh的区别

目录 前言 零.视口介绍 一.px 二.em 三.rem【重要】 3.1rem介绍 3.2rem与em的区别 四.vw、vh、vmax、vmin 五.注意问题 5.1如何使1rem 10px&#xff1f; 5.2如果父元素没有指定高度&#xff0c;那么子元素的百分比高度是多少&#xff1f; 5.3更多问题 前言 这几…

实现多级树形结构查询 比如分类(父分类、子分类)

实现多级树形结构查询 比如分类&#xff08;父分类、子分类&#xff09; 数据库表结构 CREATE TABLE course_category (id varchar(20) NOT NULL COMMENT 主键,name varchar(32) NOT NULL COMMENT 分类名称,label varchar(32) DEFAULT NULL COMMENT 分类标签默认和名称一样,p…