### C++11要点回顾:类型推导与更多特性 #### 一、类型推导:`auto`关键字 在C++11中引入了一个非常有用的特性——类型推导,这使得程序员可以在声明变量时不显式指定类型,而是让编译器自动推导出来。这一特性极大地简化了代码编写,特别是在处理复杂的类型时。 ##### `auto`的基本用法 - **基本语法**:`auto`关键字可以放在变量声明之前,告诉编译器根据初始化表达式的类型来推导该变量的类型。 - **示例**: ```cpp int main() { std::unordered_multimap<int, int> resultMap; // 在C++98中 std::pair<std::unordered_multimap<int, int>::iterator, std::unordered_multimap<int, int>::iterator> range = resultMap.equal_range(key); // 在C++11中 auto range = resultMap.equal_range(key); return 0; } ``` 如上所示,在使用`auto`之后,我们不再需要显式写出`range`的类型,这不仅使代码更简洁,也更容易阅读。 ##### `auto`的使用规则 - **必须立即初始化**:使用`auto`声明的变量必须立即进行初始化,这样编译器才能推导出它的实际类型。 - **类型推导**:编译器将根据初始化表达式的类型来决定`auto`所代表的实际类型。 - **不能作为存储类型指示符**:`auto`不能作为存储类型指示符,例如`auto int r;`是非法的。 - **示例**: ```cpp auto x = 5; // x 的类型是 int auto *pi = &x; // pi 的类型是 int* const auto v = &x; // v 的类型是 const int* static auto y = 0.0; // y 的类型是 double ``` - **指针和引用的推导**: - 当`auto`被用于指针或引用时,它会保留初始化表达式的`const`属性。 - 如果表达式是一个引用类型,`auto`会推导出原始类型而非引用类型。 - 示例: ```cpp int x = 0; auto *a = &x; // a 是 int* auto &c = x; // c 是 int& auto d = c; // d 是 int const auto e = x; // e 是 const int auto f = e; // f 是 int (非 const) const auto &g = x; // g 是 const int& auto &h = g; // h 是 const int& ``` #### 二、`decltype`关键字 `decltype`是C++11中的另一个重要特性,它允许我们在编译时推导出一个表达式的类型,而无需定义一个新的变量。这对于某些场景特别有用,比如当我们只关心类型而不关心具体的值时。 ##### `decltype`的基本用法 - **语法**:`decltype(expression)`,其中`expression`是任何合法的C++表达式。 - **示例**: ```cpp int x = 0; decltype(x) y = 1; // y 的类型是 int decltype(x + y) z = 0; // z 的类型同样是 int const int &i = x; decltype(i) j = y; // j 的类型是 const int& decltype(z) *p = &z; // p 的类型是 const int* decltype(p) *pp = &p; // pp 的类型是 const int** ``` #### 三、模板的别名:`using`关键字 C++11还引入了`using`关键字作为模板别名的一种更加灵活且强大的方式。它可以替代`typedef`来定义类型别名,并且在语法上更为直观。 ##### `using`的基本用法 - **语法**:`using alias_name = type;` - **示例**: ```cpp using uint = unsigned int; // 重定义 unsigned int using Pair = std::pair<int, int>; // 定义一个类型别名 using MapIt = std::map<int, int>::iterator; // 定义迭代器类型别名 ``` 通过以上介绍,我们可以看到C++11在类型推导方面所做的改进,使得代码更加简洁明了。这些特性对于提高代码可读性和减少错误都非常有帮助。此外,`decltype`和`using`关键字的引入也为C++程序员提供了更多的工具来处理复杂类型和模板元编程。
剩余15页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助