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
相关推荐
会编程的小孩10 小时前
C++ qt的安装小成2023032026515 小时前
C++~07补充hold?fish:palm16 小时前
40 二叉树的直径解决小子16 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制lunar_coder17 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用白白白小纯18 小时前
C++进阶.多态凯瑟琳.奥古斯特19 小时前
力扣1016高效解法:剪枝优化技巧xiangyun6119 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题坤坤子吖20 小时前
C++继承:友元、静态成员、多继承与组合