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:intauto* var1 = &var;//var:int	; auto:intauto& var2 = var;//&var:int*	; auto:int*auto var3 = &var;//var:int	; auto:intauto var4 = var;// auto在const情况下的使用//var:int	; auto:int	; var5:const intconst auto var5 = var;//var5:const int	; auto:int	; var6:intauto var6 = var5;//var:int	; auto:int	; var7:const intconst auto& var7 = var;//var7:const int	; auto:const int	; var8:const intauto& 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.mzph.cn/diannao/16072.shtml

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

相关文章

【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7 题目1&#xff1a;209.长度最小的子数组思路分析&#xff1a;思路1&#xff1a;暴力枚举 O(N^2^)思路2&#xff1a;滑动窗口 O(N) 题目2&#xff1a;3. 无重复字符的最长子串题目分析&#xff1a;思想1&#xff1a;暴力枚举哈希表O(N^2^)思想2&#xff1…

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的&#xff0c;而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制&#xff08;尤其是2的幂相关的进制&#xff0c;因为这种计数系统比十进制更接近于计算机的二进制系统&#xff09;&#xff0…

【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

IO的同步与异步、阻塞与非阻塞&#xff0c;Linux五种IO模型 IO的同步与异步&#xff0c;阻塞与非阻塞阻塞IO与非阻塞IO同步IO与异步IO Linux五种IO模型BIONIOIO多路复用信号驱动IOAIO IO的同步与异步&#xff0c;阻塞与非阻塞 我们有时会看到类似于同步阻塞式IO、同步非阻塞式…

(避坑)SpringSecurity关于使用.antMatchers放行接口不生效问题

问题 在使用SpringSecurity的时候发现放行指定接口一直没有生效&#xff0c;使用"/**"就可以生效的问题 关于securityConfig的配置代码 Beanprotected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭csrf防护…

博客开始使用 Cache Master 缓存插件

明月在给大家推荐 Cache Master 插件的时候&#xff08;可参考【推荐个比较纯正的缓存插件——Cache Master】一文&#xff09;&#xff0c;仅仅是在其他站点上试用了一下&#xff0c;今天明月正式在博客上用上了 Cache Master&#xff0c;没有想到对 Dragon 主题的支持竟然是出…

Java中的泛型擦除(Type Erasure)详解

在Java编程中&#xff0c;泛型&#xff08;Generics&#xff09;是一个强大的工具&#xff0c;它允许程序员在编写代码时定义和使用类型参数&#xff0c;从而编写更灵活、可重用的代码。然而&#xff0c;Java的泛型实现有一个重要的特点&#xff0c;即类型擦除&#xff08;Type…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

rtsp协议分析

rtsp概述 rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326&#xff1a;这是RTSP的初始定义版本v1.0&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组&#xff08;IETF&#xff09;作为RFC标准。RFC7826&#xff1a;这是RTSP的后续更新…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

JAVA面试题大全(十五)

1、Zookeeper 是什么&#xff1f; zookper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。是 google chubby 的开源实现&#xff0c;是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始&#xff0c;新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码&#xff1a; C#复制 // See https…

C++ prime 第五版 第14章 重载运算与类型转换

一、基本概念 重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。 我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说&…

某方protobuf闲谈

问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…

vulhub——Aria2、bash、catic

文章目录 一、Aria2 任意文件写入漏洞二、CVE-2014-6271&#xff08;Bash Shell 漏洞&#xff09;三、CVE-2022-46169&#xff08;Cacti 前台命令注入漏洞&#xff09; 一、Aria2 任意文件写入漏洞 Aria2是一个命令行下轻量级、多协议、多来源的下载工具&#xff08;支持 HTTP…

conda create,conda:未找到命令,ubantu添加环境变量,make工具是什么,docker工具什么,

目录 conda create -n flock_client python==3.11 conda:未找到命令,ubantu添加环境变量 添加conda到系统路径

docker-compose 搭建 单机版ELK

docker-compose 搭建 单机版ELK 前言 本次部署将使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK&#xff0c;用于学习ELK操作。在k8s集群内&#xff0c;如果每天的日志量超过20G以上&#xff0c;建议部署在k8s集群外部&#xff0c;以支持分布式集群的架构。在…

Flutter 中的 RepaintBoundary 小部件:全面指南

Flutter 中的 RepaintBoundary 小部件&#xff1a;全面指南 在Flutter的高性能渲染体系中&#xff0c;RepaintBoundary是一个重要的优化工具。它允许开发者将复杂的组件分割成独立的部分&#xff0c;以减少不必要的重绘&#xff0c;从而提高应用的性能。本文将提供RepaintBoun…

11|数据库编程:包括数据库的基本概念,JDBC的使用,数据库连接池的实现,Hibernate和MyBatis的应用等。

数据库基本概念 想象你有一个装满宝藏的箱子&#xff0c;里面放着各种宝贝&#xff0c;但这些宝贝都按照一定规则摆放。数据库就像是这样一个箱子&#xff0c;但它存放的是信息&#xff0c;比如姓名、年龄、电子邮件等。它帮我们有条理地管理数据&#xff0c;让我们可以方便地…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第26节-内嵌blender展厅

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第26节-内嵌blender展厅 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

python操作rabbitmq的consumer,并强制关闭特定consumer的连接

引入 python获取指定队列的consumer python可以使用rabbitmq_management的api获取所有consumer的信息。【队列需要安装rabbitmq_management&#xff0c;在大部分情况下&#xff0c;我们安装队列的同时&#xff0c;都会安装管理界面&#xff0c;以方便一些简单的手动操作与简单…