当前位置: 首页 > news >正文

《C++初阶之STL》【auto关键字 + 范围for循环 + 迭代器】

1. 什么是auto?

:在进行string类的模拟实现之前,我们要先来学习一下C++的两个小语法

  1. 关键字auto
  2. 范围for循环

方便后面我们进行模拟实现。

在 C语言 和 C++ 中,auto 的含义有所不同:

C 语言中的 auto

auto: 是 C 语言的存储类型说明符,用于声明具有自动存储期的局部变量

  • 具有自动存储期的变量在进入声明它的程序块时被创建,在该程序块活动时存在,退出程序块时被撤销。
  • 在函数内部定义的变量,若未声明为其他存储类型(staticregisterextern),默认就是自动变量,所以实际中auto关键字常被省略 。例如int a = 0;auto int a = 0;是等价的。
  • 另外
    • 注意一:用auto声明变量时可不进行初始化。
    • 注意二:当省略数据类型时,auto修饰的变量默认为int型 。

C++中的 auto

C++98 和 C++03 标准:与 C 语言中 auto 的含义一致,用于声明自动变量,但因即使不使用 auto 声明,变量也拥有自动生命期,所以该用法多余且极少使用 。

C++11 及以后标准:auto 被重新定义为自动推断变量类型的类型指示符

使用 auto 定义变量时必须进行初始化。

在编译阶段,编译器会根据初始化表达式来推导 auto 实际代表的类型,此时 auto 只是一个类型声明时的 “占位符” 。

代码语言:javascript

AI代码解释

auto num = 10; // num会被推导为int类型 auto str = std::string("hello"); // str会被推导为std::string类型

在 C++ 后续标准中,auto 的功能进一步扩展:

C++14

  • auto可用于推导普通函数的返回类型
    • 例如auto func() { return 42; },编译器会根据return语句推导出函数返回类型为int
  • auto可作为泛型 Lambda 表达式的参数类型提高代码复用性

C++17

  • 引入模板参数推导,允许使用 auto 指定函数模板参数类型时,编译器可根据实参推导模板参数类型
  • 引入结构化绑定,允许使用 auto 解构数组结构体tuple方便访问复合数据类型元素

总结:auto 在 C++ 中的应用,尤其是在编写模板代码或处理复杂类型时,能大大简化代码编写,提高编程效率 。

2. 使用关键字auto时需要注意什么?

在 C++ 中使用auto关键字时,需要注意以下几点:

1. 必须初始化:

auto 必须通过初始化表达式推导类型,否则会导致编译错误。

代码语言:javascript

AI代码解释

auto x; // 错误:未初始化,无法推导类型 auto x = 10; // 正确:根据10推导为int

2. 推导规则可能与预期不符:

(1)忽略顶层const引用

auto 会忽略初始化表达式的顶层const引用属性,除非显式指定

代码语言:javascript

AI代码解释

const int a = 10; auto b = a; // b的类型是int(忽略顶层const) auto& c = a; // c的类型是const int&(保留const) int x = 10; int& ref = x; auto y = ref; // y的类型是int(忽略引用)

(2)数组函数会退化为指针

当初始化表达式是数组函数时,auto 会将其推导为指针类型除非使用decltype(auto)

代码语言:javascript

AI代码解释

int arr[5] = {1, 2, 3, 4, 5}; auto ptr = arr; // ptr的类型是int*(数组退化为指针)

3. 声明指针或引用时的语法差异

指针类型:使用auto声明指针时,autoauto*等价(*可加可不加),因为编译器会根据初始化表达式自动推导为指针类型

代码语言:javascript

AI代码解释

int* p = new int(10); auto ptr1 = p; // ptr1类型为int* auto* ptr2 = p; // ptr2类型也为int*(与ptr1等价)

引用类型:声明引用时必须显式使用&,否则auto会推导为值类型(非引用)

代码语言:javascript

AI代码解释

int x = 20; auto& ref = x; // 正确:ref为int&(引用) auto val = x; // 错误:val为int(值类型,非引用)

4. 同一行声明多个变量时类型必须一致

当在同一行使用 auto 声明多个变量时,所有变量的类型必须完全一致,否则会编译报错。

因为:编译器仅对第一个变量的类型进行推导,其他变量强制使用该类型。

代码语言:javascript

AI代码解释

//错误示例: auto a = 10, b = 3.14; // 错误:a推导为int,b推导为double(类型不一致) auto* p1 = &a, p2 = &b; // 若a和b类型不同,p2可能为不同类型的指针 //正确示例: auto a = 10, b = 20; // 正确:a和b均为int auto* p1 = &a, p2 = &b; // 正确:p1和p2均为int*(假设a和b为int)

5. 不能作为函数参数,但可作为返回值(谨慎使用)

作为函数参数:auto 无法用于函数参数的类型声明。

因为:函数参数需要明确的类型。

代码语言:javascript

AI代码解释

// 错误示例: void func(auto x); // 错误:auto不能作为函数参数类型

作为函数返回值:C++14 允许auto作为函数返回类型(需通过return语句推导唯一类型),但需注意:

  • 函数体必须可见(不能在头文件中声明后在源文件中定义
  • 若存在多个return语句,推导的类型必须一致
http://www.jsqmd.com/news/474823/

相关文章:

  • 2026年混凝土外加剂实力厂家甄选指南与TOP5推荐 - 2026年企业推荐榜
  • 八皇后(dfs 模版
  • YOLOv5+GraspNet实战:如何用Python快速搭建机械臂抓取系统(附完整代码)
  • ESP32S3基础2-多任务处理、EXTI中断、时钟与定时器
  • MySQL【表的约束下】
  • 手把手教你用阿里云镜像制作glibc.i686离线安装包(CentOS7专属)
  • [特殊字符] Nano-Banana实战案例:从手机到家电,全品类产品拆解图生成实录
  • Zotero7文献笔记模版:从安装到自定义的完整指南
  • 喜讯!第十六批生成合成类算法备案备案号公布
  • 天梯赛编程题 L2—048 寻宝图 题解
  • 软件安全实战指南:从零日漏洞到安全部署的核心要义
  • Visual Studio误删.vcxproj.filters文件?3步教你手动重建(附模板)
  • Unity URP渲染管线进阶---自定义RendererFeature实战解析
  • 阿姆智创21.5寸嵌入式工控一体机,多场景智造的嵌入式终端,源头工厂ODM定制应用
  • 衡山派D133EBS开发板驱动MS1100 VOC气体传感器实战指南
  • Linux用户必备:5款免费CAD软件实测对比(附安装指南)
  • OpenMV实战指南:sensor与image模块的高效配置与图像处理技巧
  • 从SCAU综合实验到实战:C语言文件操作与字符处理的进阶解析
  • 避坑指南:PyQt5+Matplotlib动态绘图卡顿?试试这3种优化方案
  • PyTorch量化实战:从模型压缩到移动端部署
  • ENVI遥感图像处理入门实战:从数据加载到基础分析
  • 告别WebSecurityConfigurerAdapter:Spring Security 5.7+组件化配置实战
  • LangGraph实战进阶(二)——巧用条件边与循环构建可自愈的智能体
  • LegionFanControl报错?手把手教你解决TextWriter关闭问题(附Defender白名单设置)
  • 思博伦Spirent TestCenter中高效配置单播流uni-stream的实战指南
  • Ascend平台下的PageAttention优化实践
  • 从颜真卿到赵孟頫:用zi2zi-chain复刻历代书法名家字体的完整流程
  • 基于STM32的多模态智能门禁系统设计与优化
  • 【mmdetection实战】SSD模型适配自定义VOC数据集:从数据准备到模型评估全流程解析
  • OpenSSL交叉编译实战:从配置到优化的完整指南