《C++初阶之STL》【auto关键字 + 范围for循环 + 迭代器】
1. 什么是auto注在进行string类的模拟实现之前我们要先来学习一下C的两个小语法关键字auto范围for循环方便后面我们进行模拟实现。在 C语言 和 C 中auto 的含义有所不同C 语言中的 autoauto 是 C 语言的存储类型说明符用于声明具有自动存储期的局部变量具有自动存储期的变量在进入声明它的程序块时被创建在该程序块活动时存在退出程序块时被撤销。在函数内部定义的变量若未声明为其他存储类型如static、register、extern默认就是自动变量所以实际中auto关键字常被省略 。例如int a 0;和auto int a 0;是等价的。另外注意一用auto声明变量时可不进行初始化。注意二当省略数据类型时auto修饰的变量默认为int型 。C中的 autoC98 和 C03 标准与 C 语言中 auto 的含义一致用于声明自动变量但因即使不使用 auto 声明变量也拥有自动生命期所以该用法多余且极少使用 。C11 及以后标准auto 被重新定义为自动推断变量类型的类型指示符使用 auto 定义变量时必须进行初始化。在编译阶段编译器会根据初始化表达式来推导 auto 实际代表的类型此时 auto 只是一个类型声明时的 “占位符” 。代码语言javascriptAI代码解释auto num 10; // num会被推导为int类型 auto str std::string(hello); // str会被推导为std::string类型在 C 后续标准中auto 的功能进一步扩展C14auto可用于推导普通函数的返回类型例如auto func() { return 42; }编译器会根据return语句推导出函数返回类型为intauto可作为泛型 Lambda 表达式的参数类型提高代码复用性。C17引入模板参数推导允许使用 auto 指定函数模板参数类型时编译器可根据实参推导模板参数类型。引入结构化绑定允许使用 auto 解构数组、结构体和tuple方便访问复合数据类型元素。总结auto 在 C 中的应用尤其是在编写模板代码或处理复杂类型时能大大简化代码编写提高编程效率 。2. 使用关键字auto时需要注意什么在 C 中使用auto关键字时需要注意以下几点1. 必须初始化auto 必须通过初始化表达式推导类型否则会导致编译错误。代码语言javascriptAI代码解释auto x; // 错误未初始化无法推导类型 auto x 10; // 正确根据10推导为int2. 推导规则可能与预期不符1忽略顶层const和引用auto 会忽略初始化表达式的顶层const和引用属性除非显式指定代码语言javascriptAI代码解释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)代码语言javascriptAI代码解释int arr[5] {1, 2, 3, 4, 5}; auto ptr arr; // ptr的类型是int*数组退化为指针3. 声明指针或引用时的语法差异指针类型使用auto声明指针时auto和auto*等价*可加可不加因为编译器会根据初始化表达式自动推导为指针类型代码语言javascriptAI代码解释int* p new int(10); auto ptr1 p; // ptr1类型为int* auto* ptr2 p; // ptr2类型也为int*与ptr1等价引用类型声明引用时必须显式使用否则auto会推导为值类型非引用代码语言javascriptAI代码解释int x 20; auto ref x; // 正确ref为int引用 auto val x; // 错误val为int值类型非引用4. 同一行声明多个变量时类型必须一致当在同一行使用 auto 声明多个变量时所有变量的类型必须完全一致否则会编译报错。因为编译器仅对第一个变量的类型进行推导其他变量强制使用该类型。代码语言javascriptAI代码解释//错误示例 auto a 10, b 3.14; // 错误a推导为intb推导为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为int5. 不能作为函数参数但可作为返回值谨慎使用作为函数参数auto 无法用于函数参数的类型声明。因为函数参数需要明确的类型。代码语言javascriptAI代码解释// 错误示例 void func(auto x); // 错误auto不能作为函数参数类型作为函数返回值C14 允许auto作为函数返回类型需通过return语句推导唯一类型但需注意函数体必须可见不能在头文件中声明后在源文件中定义若存在多个return语句推导的类型必须一致