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

前言:本篇文章的重点
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.mzph.cn/news/31692.shtml

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

相关文章

【css】添加待小三角的提示框

如需创建在工具提示的指定侧面显示的箭头&#xff0c;在工具提示后添加“空的”内容&#xff0c;并使用伪元素类 ::after 和 content 属性。箭头本身是使用边框创建的。这会使工具提示看起来像气泡。 代码&#xff1a; <style> .tooltip {position: relative;display: …

【选择排序】直接选择排序 与 堆排序

目录 1. 排序的概念&#xff1a; 2.选择排序的基本思想 3.直接选择排序 4.堆排序 1. 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xf…

STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置&#xff0c;文章提供原理&#xff0c;代码&#xff0c;测试工程下载。 目录 时钟树与时钟系统&#xff1a; 滴答计时器&#xff1a; 定时器计时中断&#xff1a; 测试结果&#xff1a; 测…

机器学习、深度学习项目开发业务数据场景梳理汇总记录五

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

Vue [Day6]

路由进阶 路由模块的封装抽离 src/router/index.js import VueRouter from vue-router // 用绝对路径的方式来写目录 相当于src import Find from /views/Find import Friend from ../views/Friend import My from ../views/Myimport Vue from vue Vue.use(VueRouter)con…

2023年加湿器市场数据分析(天猫数据分析怎么做)

随着人们生活水平提高、空调广泛使用&#xff0c;导致皮肤紧绷、口舌干燥、咳嗽感冒等空调病的滋生。可以看出&#xff0c;空气湿度与人体健康以及日常生活有着密切的联系。而加湿器作为室内空气湿度控制的重要工具&#xff0c;在近年来受到了越来越多的重视。根据鲸参谋电商数…

python爬虫的简单实现

当涉及网络爬虫时&#xff0c;Python中最常用的库之一是requests。它能够发送HTTP请求并获取网页内容。下面是一个简单的示例&#xff0c;展示如何使用requests库来获取一个网页的内容&#xff1a; import requests 指定要爬取的网页的URL url ‘https://example.com’ 发…

Godot 4 源码分析 - 文件读入编码处理

今天需要读入xml文件进行处理&#xff0c;结果读入一个带中文的文件时&#xff0c;出错了。当然程序还能运行&#xff0c;但编译器一直报错&#xff0c;而且XML解析也不正确 单步调试发现读入的内容出现乱码&#xff0c;具体逻辑&#xff1a; String FileAccess::get_as_text…

Host Is Not Allowed to Connect to This MySQL Server

Mysql 8 版本 8.0.24 [rootVM-0-5-centos ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 128 Server version: 8.0.24 Source distribution部署在腾讯云服务器&#xff0c;本地电脑操作pyth…

C++所有运算符及其优先级表格

运算符运算符介绍优先级::范围解析1() [] -> .圆括号、方括号、箭头、点号2 --后缀递增、后缀递减2typeid const_cast dynamic_cast reinterpret_cast static_cast类型名称、常量类型转换、动态类型转换、重新解释的类型转换、静态类型转换2! ~ -- - * & (type) sizeo…

物联网与5G引领智慧城市时代的到来

智慧城市需要依赖于多种技术&#xff0c;这些技术的应用将城市转变为高效、智能、可持续发展的现代化城市。智慧城市是基于信息技术、物联网和大数据等先进技术的融合&#xff0c;旨在提升城市的运行效率、资源利用效率和居民生活质量。以下是智慧城市需要依赖的主要技术&#…

Token认证的未来:无状态身份验证的新趋势

Token认证的未来&#xff1a;无状态身份验证的新趋势 前言一、Session认证存在的问题二、什么是Token&#xff08;令牌&#xff09;认证&#xff1f;三、Token&#xff08;令牌&#xff09;认证流程四、代码演示五、Token认证优点 前言 本博主将用CSDN记录软件开发求学之路上亲…

宏任务与微任务

在 JavaScript 中&#xff0c;任务分为&#xff1a; 宏任务 macro task微任务 micro task 他们的执行顺序有一定的区别&#xff0c;理解他们的执行机制对于处理异步操作非常重要。 宏任务 宏任务是由 JavaScript 引擎提供的任务源&#xff0c;通常包括一下几种情况&#xf…

装饰器模式

装饰器模式 是一种设计模式&#xff0c;它能够在不修改原有对象的情况下&#xff0c;通过组合方式来动态地扩展对象的功能。这个模式适用于那些对象之间的继承关系复杂、需要灵活地增加功能的场景。 想象一下&#xff0c;有一个基础的对象&#xff0c;它做了某些事情。现在希望…

小程序学习笔记之一:起步

前言 参考文档&#xff1a;微信开放文档 1. 小程序简介 1.1 每个公众号下所有 Web App 累计最多可缓存 5M 的资源。 1.2 小程序之前的痛点&#xff1a;1.白屏。2.页面切换生硬。3.点击的迟滞感 1.3 小程序开发需要申请小程序账号、安装小程序开发者工具、配置项目等等过程…

Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接

Kafka3.4 SASL/kerberos ACL 证以及 SSL 加密连接 序 前面我们使用 kafka3.3.1 on zookeeper 的模式进行多网段监听的 kafka 集群&#xff0c;顺便搭建起 kafkaui 后发现一些问题&#xff0c;我们 kafka 集群没有连接认证&#xff0c;万一谁知道了我们的 kafka 连接地址&…

PHP智能人才招聘网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP智能人才招聘网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88199392 视频演示 PH…

uniapp 自定义写底部导航栏

项目的需求是根据用户的权限判断&#xff0c;当前显示哪些菜单。 项目使用uniapp vue3.0 1 根据前端写的项目目录来判断当前返回的路由是否有相同的&#xff0c;因为是数组所以做了封装函数来判断当前的路由数组。 //函数封装 function resArr(arr1, arr2) {const appTabs …

Linu网络服务NFS

linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS&#xff08;网络文件服务&#xff09; NFS是一种基于tcp/ip传输的网络文件系统协议&#xff0c;最初由sun公司开放通过使用NFS协议&#xff0c;客户机可以像访问本地…

【react】react中BrowserRouter和HashRouter的区别:

文章目录 1.底层原理不一样:2.path衣现形式不一样3.刷新后对路山state参数的影响4.备注: HashRouter可以用于解决一些路径错误相关的问题 1.底层原理不一样: BrowserRouter使用的是H5的history API&#xff0c;不兼容IE9及以下版不。 HashRouter使用的是URL的哈希值。 2.path衣…