auto 关键字
auto核心规则
auto:编译期自动推导变量类型,必须有初始值
C++11:改成类型推导关键字,不再代表存储类型
指针 & 引用推导
(1)auto y = &x; 和 auto* z = &x; 效果一样,都是指针
(2)引用必须手动写 &:auto& m = x;,只写 auto 不会推导成引用同一行多个变量:推导出来类型必须全部相同
auto aa = 1, bb = 2; // 都是int auto cc = 3, dd = 4.0; // 报错:一个int一个double,类型不一致重点
(1) 不能没有初始化:auto e;直接报错,没有值没法推导
(2) 不能直接用来定义数组:auto array[] = {4,5,6};报错
(3)C++11/14 不能做函数形参(C++20 支持 auto 参数)
(4)可以做函数返回值,但可读性变差,谨慎使用经典使用场景:简化迭代器
map<string,string> dict = {{"apple","苹果"},{"orange","橙子"}}; // 原来很长的迭代器类型 // map<string,string>::iterator it = dict.begin(); auto it = dict.begin(); // auto自动推导出迭代器类型,简化代码补充:typeid(变量).name() 用来查看推导出来的类型名
代码
auto 推导普通变量
int a = 10; auto b = a; auto c = 'a'; cout << typeid(b).name() << endl; // int cout << typeid(c).name() << endl; // charauto 接收函数返回值
int func1() { return 10; } int main() { auto d = func1(); cout << typeid(d).name() << endl; // int return 0; }auto 推导指针和引用
int x = 10; auto y = &x; // auto 推导成 int* auto* z = &x; // auto 推导成 int ,整体 z:int* auto& m = x; //auto 推导成 int, m是int 的引用 cout << typeid(y).name() << endl; // int* cout << typeid(z).name() << endl; //int * cout << typeid(m).name() <<endl; // int重点:typeid 看不到引用属性,m 本质是引用,
但 typeid 识别出来是 int,这个是 typeid 本身的特性,记住这个坑
同一行定义多个 auto 变量,类型必须相同
auto aa = 1, bb = 2; cout << typeid(aa).name() << endl; // int cout << typeid(bb).name() << endl; // int知识点:auto 在一行声明多个变量,编译器只用第一个初始值推导类型,
后面变量必须和它类型一致
auto 用作函数返回值
// auto 作为返回值 auto func3() { return 3; } int main() { auto ret = func3(); cout << typeid(ret).name() << endl; //int return 0; }知识点: C++11 支持 auto 作为函数返回类型,
编译器根据 return 后面的值推导返回类型;
auto 简化 map 迭代器
map<string, string> dict = { {"apple","苹果"},{"orange","橙子"},{"pear","梨"} }; // map<string,string>::iterator it=dict.begin(); auto it = dict.begin(); while (it != dict.end()) { cout << it->first << " : " << it->second<<endl; it++; }重点:这里 auto 自动帮我们推导出很长的迭代器类型,是 auto 最常用的场景之一
范围 for
核心
C++11 新增范围 for(range-based for),
用来简化数组、容器(string、vector、map 等)的遍历
for( 迭代变量 : 被遍历的范围 ) { //循环体 }
- : 冒号把语句分成两部分:
前面:迭代变量;
后面:要遍历的集合 / 数组 / 容器;- 自动遍历、自动取元素、自动判断结束,不用写下标、不用算长度;
- 底层:编译器会自动转成迭代器实现(容器),数组会自动识别范围。
- 重点区分 auto &e 和 auto e
(1)auto &e:引用 ,操作的是数组 / 容器里原元素 ,可以修改原值
(2)auto e:值拷贝,拿到的是元素副本,修改 e 不会影响原来的数据
【C++】String
Yyyyyy~2026-10-26 8:15
相关推荐
青少儿编程课堂11 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析another heaven11 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】qq_4069810311 小时前
c++ lamda(三)Lambda表达式I_belong_to_jesus1 天前
C++关于分支预测的优化1Rabitebla1 天前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理码客-ygluu1 天前
一个通用游戏数据服务器another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛xiaoye-duck1 天前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动思麟呀1 天前
背包DP(01背包+完全背包)