C++学习日记 Day19:C++11(上)特性补充

📅 发布时间:2026/10/14 3:26:04
C++学习日记 Day19:C++11(上)特性补充
## 今天学了什么今天学习C11的一些特性内容。## 使用auto进行自动类型推导①使用要求使用auto声明变量必须初始化。②语法auto 变量名变量值* 注当变量不是指针或引用类型时推导的结果不会保留const/引用当变量是指针或引用类型时推导的结果会保留const/引用例const int a10auto ba; //b的数据类型为 intconst int* b a;auto c b; // const int*const int d a;auto ea; //const int ③auto的限制Ⅰ.不能作为函数参数使用auto编译期行为函数声明时编译器看不到实参没办法推导类型C14/17可以Ⅱ.不能用于类的非静态成员变量的初始化class Myarr{public:auto a10; ✘}Ⅲ.不能定义数组int arr[]{1,2,3};auto a[]arr; ✘auto a[]{1,1,2};✘auto aarr; ✔auto a{1,2,3}; ✔Ⅳ.无法使用auto推导模板参数类型C17可以 :Test t2t;Testdouble t;Testauto t2t; ✘④auto的应用场景Ⅰ.用于遍历STL容器for (auto s : v){cout s ;}Ⅱ.调用相关模板函数templateclass Tvoid func(){auto ret T::get(); //不同类的同名get 成员函数};## 范围for循环①语法for声明变量要遍历的对象{}其中要遍历的对象可以是表达式、容器、数组、初始化列表等。循环会依次取出对象中的每个元素并绑定到声明的变量上从而实现对元素的逐个访问。根据实际需求可以选择不同的变量声明方式可修改遍历使用auto s以引用方式绑定元素循环体内对s的修改会直接反映到原容器中。只读遍历使用const auto s以常量引用方式绑定元素既避免拷贝开销又保证循环体内不会意外修改原数据。示例代码如下for (auto s : v) //可修改for (const auto s : v) //只读注set/map容器用auto 也不能修改key。②普通for循环与范围for循环区别Ⅰ.普通for遍历容器forauto itv.begin()it!v.end()itautovectorint::iterator范围forforauto vec:vautovalue_typeⅡ.普通for可动态操作可以修改值后不影响遍历结果范围for后面的表达式只能访问一次访问后就开始遍历如果有动态操作边界改变但遍历还是以前的大小影响遍历结果## usingC11新增新特性①类型别名对比typedeftypedef int m_int; m_int a 10; using n_int int; n_int b 11;②别名模板templateclass T struct Mymap { typedef mapint, T new_map; }; templateclass T using n_map mapint, T;Mymapint::new_map m;n_mapint m2;## override和final注加override关键字可以检查重写是否写对写在函数后面。final①修饰函数只能修饰虚函数加了以后子类不能重写父类的该函数写在函数后面。②修饰类类无后代不能用于子类继承写在类后面 class Base final。