C++初阶语法——类型指示符auto和空指针nullptr

news/2025/3/26 5:17:31/

前言:本篇文章的重点
1.C++中的类型指示符auto
2.借由auto实现的范围for
3.C++为什么要创建nullptr而不是用原本的NULL。

目录

  • 一.auto
    • 1.auto的含义及使用
    • 2.auto使用注意事项
    • 3.范围for(重头戏)
      • 范围for注意事项
  • 二.nullptr

一.auto

1.auto的含义及使用

在C++11中,标准委员会赋予了auto的含义为:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时推导而得到。

#include<iostream>
using namespace std;int main()
{int a = 10;auto b = 20;  auto c = 'x';auto d = 1.1;//typeid(变量名).name()能够显示变量的类型cout << typeid(a).name() << endl;    cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e;  错误示范,auto变量必须在定义时初始化return 0;
}

这里是引用
注意:使用auto定义变量时必须初始化,因为编译阶段编译器需要根据初始化表达式来推导auto的实际类型,因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译阶段会将auto替换为变量实际的类型。

2.auto使用注意事项

1.定义变量时必须初始化,这点在上面提到过了。

2.定义一行时,数据必须是同一种类型。
在这里插入图片描述

3 .auto不能作为函数的参数
这点跟第一点有关系,因为参数没有初始化。
在这里插入图片描述

4.auto不能直接用来声明数组
在这里插入图片描述

3.范围for(重头戏)

C语言中的for循环遍历在C++中有着更为便捷的方式——范围for,使用起来非常方便。

int main()
{int arr1[] = { 1,2,3 };//C语言写法for (int i = 0; i < sizeof(arr1) / sizeof(int); i++){cout << arr1[i] << " ";}cout << endl;//C++写法//1.依次取arr1中数据赋值给x//2.自动判定结束//3.自动迭代for (auto x: arr1){cout << x << " ";}return 0;
}

范围for注意事项

仍以上述代码为例,各位觉得下面代码运行后显示的是什么?

int main()
{int arr1[] = { 1,2,3 };for (auto x: arr1){x = x*2;}for (auto x : arr1){cout << x << " ";}return 0;
}

运行结果如下,可以看到数据并没有*2,这是因为上述代码只是依次取arr1中数据赋值给x,x的改变并不会影响数组中的数据。
这里是引用

那么若是想改变该怎么办呢?
答:可以使用引用, auto后加上&,代表x是数组中数据的别名,这样改变x就会改变数组中的数据
但是不能使用指针,因为指针类型与原数据类型不匹配。
这种时候就可以看到C++使用引用的高明之处了。

int main()
{int arr1[] = { 1,2,3 };for (auto& x: arr1)  //auto后加上&,代表x是数组中数据的别名,这样改变x就会改变数组中的数据{x = x*2;}/*for (auto* x : arr1) //auto* 类型与arr1数据类型(int)不匹配{x = x * 2;}*/for (auto x : arr1){cout << x << " ";}return 0;
}

二.nullptr

前面的几篇文章提到过C语言中的漏洞很多,nullptr就是为了弥补NULL的不足而诞生的。
下例通过函数重载构建func函数,各位觉得显示的是什么?
按照我们设计代码的初衷,Func(0)应该打印int,而Func(NULL)应该打印int*。

void Func(int x)
{cout << "int" << endl;
}
void Func(int* x)
{cout << "int*" << endl;
}
int main()
{Func(0);Func(NULL);Func(nullptr);
}

运行结果如下:
在这里插入图片描述
可以发现Func(NULL)调用的是第一个函数,与预期结果不同。
这是因为在C语言中有个一个宏定义#define NULL 0,NULL被定义为字面常量0。
因此为了代码的健壮性,C++后来创建了nullptr。

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.
在这里插入图片描述


http://www.ppmy.cn/news/1023934.html

相关文章

骨传导耳机对耳朵有损害吗?最不伤耳的骨传导耳机

骨传导耳机对耳朵有损害吗&#xff1f; 骨传导是除了空气传导之外另一种很重要的听觉方式&#xff0c;它是通过骨骼进行传递声音的&#xff0c;利用骨头振动的原理&#xff0c;声音直接绕过耳膜等神经单元&#xff0c;声音直接传送到内部耳神经。 骨传导耳机的原理就是通过人体…

在langchain中使用自定义example selector

在langchain中使用自定义example selector 简介 在之前的文章中&#xff0c;我们提到了可以在跟大模型交互的时候&#xff0c;给大模型提供一些具体的例子内容&#xff0c;方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。 如…

重磅!法大大上榜《可信企业级SaaS产品能力生态目录(2023)》

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式公布了《可信企业级SaaS产品能力生态目录&#xff08;2023&#xff09;》&#xff0c;法大大作为电子签行业领军企业荣誉上榜。 据悉&#xff0c;该目录的编制是中国信通院为了解决我国当…

prometheus监控k8s服务并告警到钉钉

一、监控k8s集群 要监控k8s集群需要使用到以下服务用于收集监控的资源信息&#xff0c;node_exporter用于监控k8s集群节点的资源信息&#xff0c;kube-state-metrics用于监控k8s集群的deployment、statefulset、daemonset、pod等的状态&#xff0c;cadvisor用于监控k8s集群的p…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

xAI与GPT-4:探索宇宙真实本质的AI之战

xAI与GPT-4&#xff1a;AI之战 写在前面第一部分推动科学研究提升人机交互引发伦理和社会问题 第二部分模型的进一步优化跨领域合作人机融合 反AI斗士 马斯克进军AI中国的AI产业怎么样AI这把火&#xff0c;还能怎么烧&#xff1f;最后总结 北京时间7月13日凌晨&#xff0c;马斯…

09-1_Qt 5.9 C++开发指南_Qchart概述

Qt Charts 可以很方便地绘制常见的折线图、柱状图、饼图等图表&#xff0c;不用自己耗费时间和精力开发绘图组件或使用第三方组件了。 本章首先介绍 Qt Charts 的基本特点和功能&#xff0c;以画折线图为例详细说明 Qt Charts 各主要部件的操作方法&#xff0c;再介绍各种常用…

Debian 12.1 正式发布

导读Debian 12.1 现已发布&#xff0c;这是对稳定发行版 Debian 12&#xff08;代号 Bookworm &#xff09;的首次更新。本次发布主要增加了安全问题的修正&#xff0c;并对严重问题进行了一些调整。 一些更新内容包括&#xff1a; 妥善处理系统用户的创建&#xff1b;修复 eq…