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.hqwc.cn/news/62833.html

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

相关文章

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…

低代码助力传统制造业数字化转型策略

随着制造强国战略逐步实施&#xff0c;制造行业数字化逐渐进入快车道。提高生产管理的敏捷性、加强产品的全生命周期质量管理是企业数字化转型的核心诉求&#xff0c;也是需要思考的核心价值。就当下传统制造业的核心问题来看&#xff0c;低代码是最佳解决方案&#xff0c;那为…

【从零开始学习JAVA | 第四十五篇】反射

目录 前言&#xff1a; ​反射&#xff1a; 使用反射的步骤&#xff1a; 1.获取阶段&#xff1a; 2.使用阶段&#xff1a; 反射的应用场景&#xff1a; 使用反射的优缺点&#xff1a; 总结&#xff1a; 前言&#xff1a; Java中的反射是一项强大而灵活的功能&#xff0…

安装Qt选择组件

最近在做Qt相关的开发&#xff0c;首先搭建开发环境&#xff0c;刚开始对组件这块不是很熟悉&#xff0c;需要了解这方面的知识&#xff0c;写下来主要是方便记住关于选择组件的说明&#xff0c;Qt版本是最新的长期维护版本&#xff0c;版本号&#xff1a;6.5.2 一、选择要安装…

最新版本2023UI千月影视APP源码 开源完美版前后端完美匹配 后端基于ThinkPHP框架

最新版本的2023UI千月影视APP源码是一款开源的完美版应用程序&#xff0c;具备前后端完美匹配的特点。该应用的后端开发基于ThinkPHP框架&#xff0c;这是一个广泛使用的PHP开发框架&#xff0c;具有稳定性和安全性方面的优势。 2023UI千月影视APP是一款提供电影、电视剧、综艺…

一文盘点 Zebec 生态的几个利好预期

Zebec Protocol 是目前商业进展最快的流支付体系&#xff0c;也是推动流支付向 Web2 世界发展的主要生态。目前&#xff0c;其已经与包括 Visa、Master 等支付巨头展开了合作&#xff0c;以推出银行卡的方式进一步向金融发达地区推出 Zebec Card 以拓展业务&#xff0c;前不久其…

【Image captioning】ruotianluo/self-critical.pytorch之1—数据集的加载与使用

【Image captioning】ruotianluo/self-critical.pytorch之1—数据集的加载与使用 作者&#xff1a;安静到无声 个人主页 数据加载程序示意图 使用方法 示例代码 #%%from __future__ import absolute_import from __future__ import division from __future__ import print_…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…

从零开始搭建个人博客网站(hexo框架)

1.工具及环境搭建 1&#xff09;注册GitHub并且新建一个repositories 2&#xff09;下载node.js以及Git 下载链接&#xff1a; 检验安装是否成功&#xff1a; 【注】&#xff1a;MacOS自带Git&#xff0c;可以直接在终端输入git --version进行检验 3&#xff09;新建一个…

基于rsesnet网络架构的图像分类模型

数据预处理部分&#xff1a; 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可DataLoader模块直接读取batch数据 网络模块设置&#xff1a; 加载预训练…