[C++11] : auto,范围for循环,“{}“列表初始化,using

[C++11] : auto,范围for循环,“{}“列表初始化,using 目录C11 四大核心知识点详解auto 自动类型推导作用基本语法基础用法结合引用、const适用场景限制与注意事项范围 for 循环基于范围的 for 循环作用标准语法基础遍历值拷贝引用遍历推荐避免拷贝遍历原生数组注意事项列表初始化统一初始化语法基础语法窄转换检查核心特性容器初始化极大简化代码类/结构体初始化普通结构体自定义类初始化列表空值类型别名 using基础用法替代 typedef函数指针别名typedef 易读性差using 优势明显模板别名using 独有能力typedef 不支持结合 const、引用using 与 typedef 总结C11 四大核心知识点详解auto 自动类型推导作用编译器根据初始值自动推导变量类型无需手动书写复杂类型简化代码、提升可读性C11 正式标准化。基本语法auto变量名初始值;基础用法// 推导为 intautoa10;// 推导为 doubleautob3.14;// 推导为 const char*autostrhello;// 推导为 std::stringautosstd::string(c11);结合引用、constauto默认舍弃引用、顶层 const如需保留必须手动加修饰符intx10;intrefx;constintcx20;// 普通auto推导为 int丢弃引用autov1ref;// auto保留引用autov2ref;// const auto保留 const 引用常用避免拷贝constautov3cx;适用场景复杂容器迭代器最常用std::vectorintvec{1,2,3};// C11 前std::vectorint::iterator itautoitvec.begin();模板返回值、长类型、lambda 接收等场景。限制与注意事项变量必须初始化auto a;编译报错无初始值无法推导不能用于函数形参、类非静态成员变量普通函数的形参类型是确定类型一旦用 auto函数直接变成模板函数每传一种不同类型编译器会实例化一份新函数函数地址、重载决议、函数指针绑定全部改变同一作用域下auto变量推导类型固定不能二次赋值不同类型。范围 for 循环基于范围的 for 循环作用简化容器/数组遍历无需手动管理迭代器、下标C11 新增语法。标准语法for(元素声明:可遍历对象){循环体;}可遍历对象数组、std::string、STL 容器vector/map/list 等。基础遍历值拷贝std::vectorintvec{1,2,3,4};// elem 是容器元素的拷贝修改不影响原容器for(autoelem:vec){std::coutelem ;elem1;// 仅修改副本}引用遍历推荐避免拷贝auto可读写原元素const auto只读遍历性能最优优先使用// 读写遍历for(autoelem:vec){elem*2;}// 只读遍历常量容器/仅读取场景conststd::vectorintcvvec;for(constautoelem:cv){std::coutelem ;}遍历原生数组intarr[]{10,20,30};for(autox:arr){std::coutx ;}注意事项反汇编后范围 for依赖迭代器遍历过程中不要增删容器元素会导致迭代器失效无法直接获取当前元素下标需要下标时改用传统 for 循环仅支持完整遍历不能指定起始/结束位置。列表初始化统一初始化语法C11 统一{}初始化规则称为列表初始化解决 C98 不同类型初始化语法混乱问题又称大括号初始化。基础语法所有类型统一使用{}初始化支持变量、数组、结构体、类、容器。// 内置类型inta{10};doubleb{3.14};// 数组intarr[]{1,2,3};intarr2[3]{10,20};// 未赋值元素自动置0窄转换检查核心特性{}会严格禁止隐式窄类型转换编译报错规避隐性 bug()无此限制。intx13.9;// C98 允许截断为 3隐患intx2(3.9);// 允许截断intx3{3.9};// C11 编译报错浮点转整型属于窄转换容器初始化极大简化代码STL 容器直接用{}初始化元素C98 无法实现// vector 初始化std::vectorintv{1,2,3,4};// map 键值对初始化std::mapint,std::stringm{{1,a},{2,b}};类/结构体初始化普通结构体structPoint{intx;inty;};Point p{100,200};// 顺序赋值成员自定义类classTest{public:Test(inta):num(a){}private:intnum;};Test t{666};// 调用构造函数初始化列表空值{}表示零初始化内置类型初始化为 0类调用默认构造intn{};// n 0doubled{};// d 0.0类型别名 usingC11 扩展using关键字实现类型别名替代传统typedef语法更直观、支持模板别名。基础用法替代 typedef语法对比typedef 原类型 别名;C98using 别名 原类型;C11推荐// 1. 普通类型别名typedefunsignedintuint;usingUIntunsignedint;// 等价语法更自然// 2. 容器类型别名长类型简化typedefstd::vectorstd::stringStrVec;usingStringVecstd::vectorstd::string;函数指针别名typedef 易读性差using 优势明显// C98 typedef 写法晦涩typedefvoid(*Func)(int,int);// C11 using 写法直观别名 原类型usingFuncPtrvoid(*)(int,int);模板别名using 独有能力typedef 不支持这是using最大亮点可以给模板起别名// 给 vector 模板起别名templatetypenameTusingVecstd::vectorT;// 使用Vecintv1;Vecstd::stringv2;结合 const、引用usingIntRefint;usingConstStrconststd::string;using 与 typedef 总结功能等价基础类型、指针、引用场景均可互换语法using 别名 类型阅读顺序和逻辑一致更友好关键区别仅 using 支持模板别名现代 C 优先使用using。