初识C++ (五)

简介: 初识C++ (五)

auto关键字


auto是C++程序设计语言的关键字。自C++11以来,auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。


c语言之前的用法


在很久很久之前 c语言中auto的用法是这样子的


3a83a7a016364d5dafca2220370314af.png


在前面加上一个auto 就表示让这个a变成一个局部变量 使用完毕之后就自动销毁


但是呢 我们在使用完毕的时候 它会自动销毁 所以说也没必要加上auto关键字多此一举


所以说 auto关键字也就被慢慢废弃了


直到c++中 新的标准赋予了它新的用法


C++中的新用法


在c++中 auto关键字被赋予了一种新用法


auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。


光说没有用 给大家敲几段代码演示下


// c++新用法 
  int a = 10;
  auto b = a;


char c = 'a';
  auto d = c;


那么这个猜猜看 b的类型是什么呢?


d的类型又是什么呢?


(这里介绍下打印类型的函数 )


typeid(name).name()

c6b8f045233c435d88181509d35ad3a8.png


我们这个时候可以发现 a b 类型一致 c d类型一致


这也就能基本说明auto的用法了吧


auto使用细则


auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&


还是一样 我们来看代码


int x = 10;
  auto a = &x;
  auto* b = &x;
  auto& c = x;
  cout << typeid(a).name() << endl;
  cout << typeid(b).name() << endl;
  cout << typeid(c).name() << endl;



接下来我们来看看它们三个分别是什么类型

9179754126f84869bbd0118f6a1a3908.png


指针和int


这也就很好的解释了我上面的这句话


auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&


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


比如说我们写出以下代码


int a = 10, b = 20;
  auto c = 10, d = 20;


这样的代码就是没问题的 编译器可以运行通过


43ee5191ceac457ea7b97321c309209a.png


但是我们改成这样子


392f91ba8691472bafebd832b068c309.png


是不是就直接报错了


auto不能使用的场景


这里老师讲解的时候说的是两个场景 我个人以为是三个 如果说我的理解有什么误区欢迎大佬们在评论区


指正


1. 未初始化时候

04a916e4644843bba1269dbd5e0173a3.png

这个很好理解 和引用一样 你不给我一个其他量我怎么进行推导呢?


2. 做参数的时候

7c2fb9d0bfd54e2db5edad6067cce1c5.png

这里也很明显的报错了 内容也很明确 我们不能用来做参数


3. auto不能用来定义数组


比如说我们写出以下代码


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


这里就给出了很明确的报错 auto类型不能出现在数组中


auto的使用场景


1. 变量的类型很复杂的时候


比如说以下代码


#include <string>
#include <map>
int main()
{
    std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red",
  "红色" }};
  std::map<std::string, std::string>::iterator it = m.begin();
  while (it != m.end())
  {
  //....
  }
  return 0;
}


我们这里如果不想要写这么复杂的话只需要使用一下auto关键字就可以


#include <string>
#include <map>
int main()
{
  std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red",
  "红色" }};
  auto it = m.begin();
  while (it != m.end())
  {
  //....
  }
  return 0;


这两段代码实现的功能是一模一样的 怎么样 是不是很方便


2. 语法糖:遍历数组


在c语言中我们想要遍历一个数组是不是必须要用下标找出每个元素 然后打印啊


但是呢在c++中引入了一种新的方式


我们将这种方式称为语法糖(使用起来很方便 跟吃糖一样)


int arr[] = { 1,2,3,4,5,6,7,8,9 };
  for (auto x :arr)
  {
  cout << x << ' ';
  }

1b00301fbf534e5584433203bbff55fd.png1b00301fbf534e5584433203bbff55fd.png

这个的原理是什么呢?


其实就是将arr里面的值一个个赋值给x 之后打印出来


那么如果我们想要这么修改数组里面的值 这样可行嘛


很显然是不可以的


因为都说了是赋值嘛


那么这时候聪明的同学肯定就想到了两种解法了对不对


一种是引用 一种是指针


我们来看看引用可以不可以

1b00301fbf534e5584433203bbff55fd.png


是可以的 思路没有错


那么指针可不可以呢?


还记得我之前说过的一句话嘛?


其实就是将arr里面的值一个个赋值给x 之后打印出来


指针是不是要指向一个地址啊 所以说要取地址才可以 赋值当然不行啦


3. for遍历的限制条件


注意 如果使用的函数传参数组的话这里就不能使用for遍历了


为什么了呢?


数组传参传的是什么啊?


是不是首元素地址啊


只是把地址传递进去的话 编译器怎么会知道遍历的范围呢?


所以说会报错


nullptr指针(c++11标准中的空指针)


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


比如说这样子的代码

d18a4d3c25d74f47881b04982affebcf.png


两行代码都是定义空指针


但是呢 在c语言中的空指针会遇到一些错误

1e470ad15aed4fa78da967f46d4ab6e9.png


f4894ad581664f04b39e0d7520dc89ed.png



就像这样子


所以说在c++中引入了一个这样一个标准

ab7cc57d694d4e83aa0b156fe4e376f1.png


我相信 通过这几个例子大家应该能够充分理解为什么引入nullptr了


所以说在我们以后的编程中 尽量使用nullptr而不使用NULL了


总结


本文简单介绍了auto关键字 和nullptr指针


由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正

最后如果这篇博客帮助到了你 别忘了一键三连啊


阿尼亚 哇酷哇酷!

相关文章
|
8月前
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
|
存储 Java C++
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
607 0
|
开发者
全网最全最简单使用easypoi导入导出Excel的操作手册(二)
今天做Excel导出时,发现了一款非常好用的POI框架EasyPoi,其 使用起来简洁明了。现在我们就来介绍下EasyPoi,首先感谢EasyPoi 的开发者 Lemur开源
9356 1
全网最全最简单使用easypoi导入导出Excel的操作手册(二)
|
14天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171330 12
|
17天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150295 32
|
25天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201961 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
2天前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
7天前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
1251 8
|
7天前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
1301 24
|
9天前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。