auto/范围for/nullptr(C++)

文章目录

  • 前言
  • auto
  • 范围for
  • nullptr
  • 总结


前言

auto

auto主要用于类型推导,代替长类型

auto在c语言使用时修饰变量,表示这个变量是具有自动存储器的局部变量,但是在实际中几乎不会使用。

C++11赋予了他新的含义,auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

#include <iostream>
using namespace std;int main()
{int a = 10;auto b = a;auto* pa1 = &a;auto pa2 = &a;auto& aa = a;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(pa1).name() << endl;cout << typeid(pa2).name() << endl;cout << typeid(aa).name() << endl;return 0;
}

typeid().name()可用于打印类型。
对于指针*可写可不写。
但是对于引用,&必须加上。

auto使用时必须进行初始化,编译器在编译期间需要根据类型进行推导。
在编译期间将auto替换为实际类型。

在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器就会报错。因为编译器会根据第一个类型进行推导,然后用推导出的类型定义其他变量。

auto不能做参数,也不建议做返回值。
auto也不能用来声明数组。

auto b[]={1,2,3,4};会报错。

为了避免与c++98的auto发生混淆,c++11只保留了auto作为类型指示符的用法。

范围for

我们对数组进行遍历,可以用下面方法

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

但是这样很麻烦,c++11引入了范围for
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)e *= 2;
for(auto e : array)cout << e << " ";
return 0;
}

依次取数组中的值赋值给e,自动判断结束,自动++。

也可以结合break,continue使用。

我们如果想要对数据进行修改,就必须加&(引用),这个用指针实现不了的。

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

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

这段代码就不可以,范围不确定。

nullptr

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

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

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

NULL可能被定义为字面常量0,或者被定义为无类型指针(void)的常量*

void f(int)
{cout<<"f(int)"<<endl;
}
void f(int*)
{cout<<"f(int*)"<<endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

注意:
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2.在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

3 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

总结

以上就是今天要讲的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30876.shtml

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

相关文章

conda install xformers -c xformers/label/dev 的安装问题

在StableSR项目框架中&#xff0c;需要执行 conda install xformers -c xformers/label/dev 但是报错&#xff0c;错误显示&#xff0c;版本不匹配&#xff0c;如下所示&#xff1a; 我改用pip来安装&#xff0c;好像就不报错了&#xff1a; pip install xformers

javaWeb项目-ssm+vue企业台账管理平台功能介绍

本项目源码&#xff1a;javaweb项目ssm-vue企业台账管理平台源码-说明文档资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboo…

vue项目——前端CryptoJS加密、解密

1、vue项目需要安装CryptoJS安装包 npm install crypto-js 2、在项目中引入CryptoJS import CryptoJS from crypto-js 3、使用&#xff0c;代码如下 // 此处key为16进制let key jiajiajiajiajiajiajiajia;console.log(密钥&#xff1a;, key);// key格式化处理key Crypt…

中国环保网元宇宙:开启绿色数字生活新篇章

在全球数字化浪潮和环境保护的双重推动下&#xff0c;"中国环保网元宇宙"应运而生&#xff0c;它不仅代表着技术的革新&#xff0c;更是环保意识在数字世界中的深刻体现。这一平台旨在通过沉浸式的虚拟现实技术&#xff0c;让公众更加直观地理解环保的重要性&#xf…

Baidu 搜狐面经

百度一面 1、Spring中有哪些常用注解&#xff1f; 2、如果一个服务入参是JsonString&#xff0c;出参也是jsonString&#xff0c;这个服务可能用到什么注解&#xff1f; 3、HSF的底层原理是否了解&#xff1f;序列化传输的协议是什么&#xff1f; 4、Postgrep Sql相比mysql…

【前端开发工具】VS Code安装和使用

文章目录 一、前言二、下载三、安装四、配置五、使用5.1 导入项目5.2 本地运行项目5.3 修改界面文案&#xff0c;验证效果5.4 添加日志打印5.5 代码调试5.6 代码提交到Git仓库 六、总结 一、前言 本文介绍一下在前端vue项目中&#xff0c;VS Code的安装和配置。 什么是VS Code…

【干货分享】25地学考研推免夏令营汇总表

​ 25考研学子们&#xff0c;考研准备要赶早。 小编给大家整合准备了25地信考研夏令营时间信息表&#xff0c;需要的宝子收藏起来。 ​ 话不多说&#xff0c;需要的小伙伴直接评论区留言 25地信考研择校信息表&#xff1a;

IT入门知识第一部分《IT基础知识》(1/10)

目录 IT入门知识第一部分《IT基础知识》&#xff08;1/10&#xff09; 1.引言 2.第一部分&#xff1a;IT基础知识 2.1 计算机硬件 CPU&#xff1a;计算机的心脏 内存&#xff1a;数据的临时居所 存储设备&#xff1a;数据的长期仓库 输入输出设备&#xff1a;与计算机的…

大模型日报2024-06-20

大模型日报 2024-06-20 大模型资讯 大模型产品 Genspark&#xff1a;AI智能搜索引擎 摘要: Genspark是一款AI智能引擎&#xff0c;专用AI代理生成无偏见的Sparkpages&#xff0c;提供高价值信息&#xff0c;节省用户时间。 AI标志动画生成工具 摘要: 使用AI技术轻松将静态标志变…

[Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整

目录 前言 上篇的内容概况 下篇的内容概况 数据库的分类 关系型数据库 常见的关系型数据库系统 非关系型数据库 1. 键值对数据库&#xff08;Key-Value Stores&#xff09; 特点&#xff1a; 常见的键值对数据库&#xff1a; 2. 文档数据库&#xff08;Document Store…

BUG: gradio RuntimeError: async generator raised StopAsyncIteration

BUG: gradio RuntimeError: async generator raised StopAsyncIteration 环境 gradio 4.20.0详情 在使用gradio编写大模型可视化demo的时候&#xff0c;大模型正常输出&#xff0c;但gradio弹出此错误。 经过排除&#xff0c;发现是返回方式的问题&…

【React】Axios请求头注入token

业务背景: Token作为用户的数据标识&#xff0c;在接口层面起到了接口权限控制的作用&#xff0c;也就是说后端有很多接口都需要通过查看当前请求头信息中是否含有token数据&#xff0c;来决定是否正常返回数据 // 添加请求拦截器 request.interceptors.request.use(config …

填坑-celery正常启动后能收到任务但不执行任务的解决办法

场景 Flask开发中用celery 6正常启动后能收到任务但不执行任务的解决办法&#xff0c;也没有错误提示…… INFO/MainProcess] Task app.add_together[ce406ed8-71b3-49e6-8556-f44bfe66549c] received [2024-06-20 19:38:10,632: INFO/SpawnPoolWorker-36] child process 2244…

MySQL中动态权限和角色管理权限的异同?

MySQL中的动态权限与角色管理权限是两个不同的概念&#xff0c;它们在权限管理方面各有特点和作用&#xff1a; 动态权限&#xff08;Dynamic Privileges&#xff09; 定义与特性&#xff1a;动态权限是在MySQL服务器运行时定义和注册的权限&#xff0c;与之相对的是静态权限&…

编译 CUDA 程序的基本知识和步骤

基本工具 NVCC&#xff08;NVIDIA CUDA Compiler&#xff09;: nvcc 是 NVIDIA 提供的 CUDA 编译器&#xff0c;用于将 CUDA 源代码&#xff08;.cu 文件&#xff09;编译成可执行文件或库。它可以处理 CUDA 和主机代码&#xff08;例如 C&#xff09;的混合编译。nvcc 调用底层…

关于Threejs的使用二

Threejs之前是没有使用过的&#xff0c;由于项目需要最近一段时间一直在研究&#xff1b; 关于绘制字体&#xff1a; 有两种方案&#xff1a; 1.可以通过页面添加标签化元素进行插入到页面中&#xff1a; //創建元素const descriptionElement document.createElement(div);de…

求最小生成树的新算法

不管 prim 算法还是 kruskal 算法都基于 “当前可见最短边” 作贪心策略&#xff0c;但这并不适合分布式并行操作&#xff0c;比方说所有节点一起构建最小生成树&#xff0c;这些算法都显得同步开销过大&#xff0c;甚至导出错误的结果。 最近研究并构建最大流多路径传输协议的…

docker容器之间ip能ping通,但是端口访问不了

docker容器之间ip能ping通&#xff0c;但是端口访问不了 curl: (7) Failed to connect to 172.17.0.5 port 80: No route to host原因&#xff1a; 可能是因为启动docker前&#xff0c;服务器防火墙是关闭的&#xff0c;而启动之后修改了防火墙规则 解决方法&#xff1a; 重启…

如何获得一个Oracle 23ai数据库(vagrant box)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 前面我博客介绍了3种方法&#xff1a; Virtual ApplianceRPM安装Docker 今天介绍最近新出的一种方法&#xff0c;也是我最为推荐的…

java通过jts获取点到线的垂足点

在Java中&#xff0c;可以使用JTS&#xff08;Java Topology Suite&#xff09;库来获取点到线段的垂足点。以下是一个简单的示例代码&#xff0c;展示了如何使用JTS获取点到线段的垂足点&#xff1a; 首先&#xff0c;确保你的项目中包含了JTS库。 import org.locationtech.j…