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 主题的支持竟然是出…

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;在里面定义两个方…

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…

docker-compose 搭建 单机版ELK

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

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

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

网络编程的基础知识(适合新手)

网络编程 在Java中&#xff0c;网络编程是指使用Java语言进行网络通信的编程技术。这种技术使得位于不同地理位置的计算机能够通过网络进行通信&#xff0c;实现资源共享和信息传递。 一、定义 Java网络编程是Java语言在网络通信方面的应用&#xff0c;它利用Java提供的网络…

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…