当前位置: 首页 > news >正文

【C++】语法小课堂 --- auto关键字 typeid查看实际类型 范围for循环 空指针nullptr

在这里插入图片描述

文章目录

  • 🍟一、auto关键字(C++11)
    • 🍩1、auto的简介
    • 🍩2、auto的使用细则
      • 🚩auto与指针和引用结合起来使用
      • 🚩 在同一行定义多个变量
    • 🍩3、auto不能推导的场景
      • 1️⃣auto不能作为函数的参数
      • 2️⃣auto不能直接用来声明数组
    • 🍩4、auto使用的注意事项
  • 🍟二、基于范围的for循环(C++11)
    • 🍄1、范围for的语法
    • 🍄2、范围for的使用条件
      • 1️⃣for循环迭代的范围必须是确定的
      • 2️⃣迭代的对象要实现++和==的操作
  • 🍟三、指针空值nullptr(C++11)
    • 🚨注意:

在这里插入图片描述

🍟一、auto关键字(C++11)

🍩1、auto的简介

🚩在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto定义的变量的类型由变量定义和初始化语句等号的右边的值的类型决定,auto声明的变量必须由编译器在编译时期推导而得

举个栗子看一下:👇

int TestAuto()
{return 10;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = 8.6;auto e = TestAuto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << typeid(e).name() << endl;return 0;
}

在这里我们要插入一个知识点 — typeid 操作符

🔴typeid( x ).name()用来查看数据(x)实际数据类型

这里暂且不做过多介绍,简单了解一下
程序运行结果:
在这里插入图片描述

在面向对象的复杂编程中, 有时我们很难确定一个表达式的返回值会是什么类型的,这种时候就可以用auto声明的变量来接收表达式的值。还有些时候,C++编程中,表达式的值是一些很复杂的自定义类型值,这时也可以用auto声明的变量来接收表达式的值

比如如下场景:

#include <iostream>
#include <time.h>
#include <string>
#include <map>using std::cout;
using std::endl;int main()
{std::map<std::string, std::string> m{ { "apple", "苹果" }, { "orange","橙子" },{"pear","梨"} };auto it  = m.begin();auto声名的变量it来接收表达式的返回值while (it != m.end()){//....}return 0;
}

🚩上面代码段中的std::map<std::string, std::string>就是一个复杂的类型,m.begin()返回值就可以用auto声名的变量it来接收,十分方便
🚩typedef(类型重定义)也可以简化上述代码,但是typedef用于重定义指针类型并用于声明变量时,无法用const来保护指针所指向内存空间
🔴因此typedef的使用也是由局限性,相比之下auto的使用更方便灵活

🍩2、auto的使用细则

🚩auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

🥰举个栗子🌰:

int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << a << " " << b << " " << c << " " << endl;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;return 0;
}

在这里插入图片描述

🚩 在同一行定义多个变量

先看下面这段代码:

void TestAuto()
{auto a = 1, b = 2;auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

在这里插入图片描述

🚩当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

🍩3、auto不能推导的场景

1️⃣auto不能作为函数的参数

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{//...
}

在这里插入图片描述

2️⃣auto不能直接用来声明数组

void TestAuto()
{int a[] = {1,2,3};auto b[] = {456};
}

在这里插入图片描述

3️⃣为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4️⃣auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用

🍩4、auto使用的注意事项

(1) 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型
在这里插入图片描述
在这里插入图片描述
🚨不初始化是不可以的哦!

(2)auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型 (可以理解为:我定义初始化一个变量 a = 10; 但是int跑了,于是我auto先帮你占个为位子,等编译器要处理到的时候,我auto再和被编译器找回来的int换回来)

🍟二、基于范围的for循环(C++11)

在C++98中如果要遍历一个数组,可以按照以下方式进行:

int main()
{int array[] = { 1, 2, 3, 4, 5 };for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){array[i] *= 2;}for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){cout << array[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述
这是我们熟悉的for循环写法

🍄1、范围for的语法

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

请看下面代码演示:

int main()
{int array[] = { 1,2,3,4,5 };for (auto& x : array)    //依次取数组中的数据赋值给x								{						 //自动判断结束x *= 2;				 //自动迭代}for (auto x : array){cout << x << " ";}cout << endl;return 0;
}

在这里插入图片描述

🔴注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环

🍄2、范围for的使用条件

1️⃣for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围

🚨注意:以下代码就有问题,因为for的范围不确定:

void TestFor(int array[])
{for (auto& e : array)cout << e << endl;
}

在这里插入图片描述

2️⃣迭代的对象要实现++和==的操作

关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了🥰

🍟三、指针空值nullptr(C++11)

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
在这里插入图片描述

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

//C的一个坑
void func(int)
{cout << "f(int)" << endl;
}
void func(int*)
{cout << "f(int*)" << endl;
}
int main()
{func(0);func(NULL);func((int*)NULL);func(nullptr);//nullptr --- (void*)类型return 0;
}

在这里插入图片描述

程序本意是想通过func(NULL)调用指针版本的 func(int*) 函数,但是由于NULL被定义成0,因此与程序的初衷相悖

在C++98中,字面常量0既可以是一个整型数字,也可以是无类型的指针 (void*)常量,但是编译器默认情况下将其看成是一个整型常量,如果要将其按照指针方式来使用,必须对其进行强转 (void*)0

🚨注意:

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

😍这期内容比较容易理解,希望烙铁们能理解消化,有所收获哦!

总结🥰
以上就是 【C++】语法小课堂 的全部内容啦🥳🥳🥳🥳
本文章所在【C++初阶】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

相关文章:

【C++】语法小课堂 --- auto关键字 typeid查看实际类型 范围for循环 空指针nullptr

文章目录 &#x1f35f;一、auto关键字&#xff08;C11&#xff09;&#x1f369;1、auto的简介&#x1f369;2、auto的使用细则&#x1f6a9;auto与指针和引用结合起来使用&#x1f6a9; 在同一行定义多个变量 &#x1f369;3、auto不能推导的场景1️⃣auto不能作为函数的参数…...

Vercel 部署的项目发现APIkeys过期了怎么办

好不容易部署的Vercel&#xff0c;发现APIkeys过期了显示&#xff0c;查了查资料发现只要更新下新的apikeys&#xff0c;然后再重新部署下就好了。 重新设置APIkeys 1.1. 进去 Vercel 项目内部控制台&#xff0c;点击顶部的 Settings 按钮&#xff1b; 1.2 点击环境变量Enviorn…...

【HMS Core】推送报错907135701、分析数据查看

【关键字】 HMS、推送服务、分析服务 【问题描述1】 集成推送服务&#xff0c;获取Token时报错 907135701: scope list empty 【解决方案】 907135701OpenGW没有配置Scope 1、您可以检查下网络是否有问题&#xff0c;手机是否可以正常连接互联网 2、查看推送服务开关是否正…...

Air32 | 合宙Air001单片机内部FLASH读写示例

Air32 | 合宙Air001单片机内部FLASH读写示例 代码已经通过测试&#xff0c;开发环境KEIL-MDK 5.36。 测试代码 void FLASH_RdWrTest(void) {uint32_t Address;uint32_t PageReadBuffer[FLASH_PAGE_SIZE >> 2];uint32_t PageWriteBuffer[FLASH_PAGE_SIZE >> 2];mem…...

C语言基本语法-第一章

C 语言基本语法 语句 C 语言的代码由一行行语句&#xff08;statement&#xff09;组成。语句就是程序执行的一个操作命令。C 语言规定&#xff0c;语句必须使用分号结尾&#xff0c;除非有明确规定可以不写分号。 int x 1;上面就是一个变量声明语句&#xff0c;声明整数变…...

八、Spring 整合 MyBatis

文章目录 一、Spring 整合 MyBatis 的关键点二、Spring 整合 MyBatis 的步骤2.1 创建 Maven 项目&#xff0c;并导入相关依赖2.2 配置 Mybatis 部分2.3 配置 Spring 部分2.3 配置测试类 一、Spring 整合 MyBatis 的关键点 1、 将 Mybatis 的 DataSource (数据来源)的创建和管理…...

Flutter Flar动画实战

在Flare动面出现之前,Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画,如果遇到一些复杂的场景,使用这些动画方案实现起来还是有难度的。不过,随着Flutter开始支持Flare矢量动面,Flutter的动画开发也变得越来越简单。事实上,Flare动画…...

A stop job is running for xxxxxx

有时候服务器关机时&#xff0c;会有个进程卡在那里&#xff0c;使系统无法关闭 提示&#xff1a; A stop job is running for xxxxxx方法&#xff1a; 设置一个启动/停止的默认超时时间即可 vim /etc/systemd/system.conf DefaultTimeoutStartSec300s DefaultTimeoutStopSe…...

C++入门之stl六大组件--List源码深度剖析及模拟实现

文章目录 前言 一、List源码阅读 二、List常用接口模拟实现 1.定义一个list节点 2.实现一个迭代器 2.2const迭代器 3.定义一个链表&#xff0c;以及实现链表的常用接口 三、List和Vector 总结 前言 本文中出现的模拟实现经过本地vs测试无误&#xff0c;文件已上传gite…...

windows下以指定用户访问SMB服务器进行读写

一 概述 最近遇到一个问题&#xff0c;linux 的 smb服务器开启匿名访问&#xff0c;windows访问linux文件夹不需要用户名密码就可以进去使用&#xff0c;但是存在一个问题&#xff0c;ssh连接到linux 后修改的文件&#xff0c;在windows已smb方式下打开某个文件修改 是没有权限…...

数组根据属性去重

利用reduce函数处理&#xff0c;直接上代码&#xff01; let data [{name:晓明,id:1},{name:德华,id:2},{name:德华,id:2},{name:晓明,id:1},] var obj {}; let arr data.reduce(function (item, next) {obj[next.id] ? : obj[next.id] true && item.push(next)…...

无损音乐从哪找?五个网站+免费下载,你确定不来看看?

hi&#xff0c;大家好我是技术苟&#xff0c;每天晚上22点准时上线为你带来实用黑科技&#xff01;由于公众号改版&#xff0c;现在的公众号消息已经不再按照时间顺序排送了。因此小伙伴们就很容易错过精彩内容。喜欢黑科技的小伙伴&#xff0c;可以将黑科技百科公众号设为标星…...

2023华数杯数学建模B题思路模型论文分析

目录 一.2023华数杯数学建模最新思路&#xff1a;比赛开始后第一时间更新 更新查看文末名片 二.华数杯简介 三.往年华数杯赛题简介分析&#xff1a; 一.2023华数杯数学建模最新思路&#xff1a;比赛开始后第一时间更新 更新查看文末名片 二.华数杯简介 华数杯简介 国赛前…...

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker&#xff0c;顾名思义&#xff0c;就是将 k8s 所需要的所有组件&#xff0c;全部部署在一个docker容器中&#xff0c;是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用&#xff0c;但是如果你只是想在本地简单…...

从0到1开发go-tcp框架【4实战片— — 开发MMO之玩家聊天篇】

从0到1开发go-tcp框架【实战片— — 开发MMO】 MMO&#xff08;MassiveMultiplayerOnlineGame&#xff09;&#xff1a;大型多人在线游戏&#xff08;多人在线网游&#xff09; 1 AOI兴趣点的算法 游戏中的坐标模型&#xff1a; 场景相关数值计算 ● 场景大小&#xff1a; 250…...

无重复字符的最长子串 LeetCode热题100

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长连续子字符串 的长度。 思路 使用滑动窗口&#xff0c;记录窗口区间的长度大小&#xff0c;取最大值。用map存储滑动窗口内所有字符&#xff0c;字符作为key&#xff0c;每个字符的数量作为value。遍历…...

Docker搭建zookeeper

问题背景 前言 本文参考自&#xff1a;docker-compose快速搭建Zookeeper集群还有一种更加详细更加全面的部署方式&#xff1a;Docker之docker-compose一键部署Zookeeper集群&#xff0c;但笔者还未验证&#xff0c;先记录下来 搭建 安装docker-ce 此处不赘述 安装docker-co…...

LeetCode 热题 100 JavaScript--160. 相交链表

/*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//*** param {ListNode} headA* param {ListNode} headB* return {ListNode}*/// 1、暴力解法 var getIntersectionNode function(headA, headB) {var p1 …...

AWS S3 协议对接 minio/oss 等

使用亚马逊 S3 协议访问对象存储 [s3-API](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html)- 兼容S3协议的对象存储有- minio- 似乎是完全兼容 [兼容文档](https://www.minio.org.cn/product/s3-compatibility.htm…...

手机便签内容不见了怎么恢复正常?

在日常生活和工作中&#xff0c;很多人都需要随手记录事情&#xff0c;例如家庭琐事、孩子相关的事情、指定时间需要完成的工作任务、会议安排等。当我们需要随时随地记录事情的时候&#xff0c;手机便签应用就是非常不多的选择&#xff0c;我们直接打开手机上的便签APP就可以新…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...