C++11新特性详解:nullptr、auto、decltype与更多

需积分: 1 33 下载量 150 浏览量 更新于2024-07-09 1 收藏 1.39MB PDF 举报
"C++11新特性.pdf" C++11是C++语言的一个重要更新,引入了许多新特性,旨在提高代码的可读性、安全性和效率。以下是对这些特性的详细解释: 一、`nullptr` `nullptr`是C++11引入的新关键字,专门用于表示空指针。它的主要优点在于消除了`NULL`宏和整数0作为空指针可能导致的混淆。在某些编译器中,`NULL`可能被定义为`(void*)0`或整数0,这可能导致类型不匹配的问题。使用`nullptr`可以明确地表示空指针,避免了这些潜在风险。 二、类型推导:`auto`和`decltype` 1. `auto`关键字允许编译器根据变量的初始值自动推断变量类型。不过,`auto`不能用于函数参数类型推导,也不能推断数组类型。例如: ```cpp int x = 42; auto y = x; // y也是int类型 ``` 2. `decltype`则是基于表达式的类型获取,它可以用于推断变量或表达式的类型,即使表达式的结果未被赋值。例如: ```cpp int x = 42; decltype(x) y; // y的类型是int ``` 三、初始化列表 (`initializer_list`) 初始化列表允许使用大括号`{}`来初始化数组、容器(如`std::vector`)等,提供了统一的初始化方式。此外,它还可以作为构造函数的参数,使得类对象的初始化更加灵活。例如: ```cpp std::vector<int> v = {1, 2, 3}; // 使用初始化列表初始化vector ``` 四、模板嵌套 C++11之前,连续的右尖括号`>>`会被解析为右移运算符。但在C++11中,这不再是个问题,可以正确处理嵌套的模板,如二维向量`std::vector<std::vector<int>>`。这极大地增强了模板的灵活性和表达能力。 五、Lambda表达式 1. Lambda表达式是一种匿名函数,可以直接在需要的地方定义和使用,无需预先声明。Lambda表达式的语法如下: ```cpp [capture](params) mutable exception -> return_type { body; } ``` 其中,`capture`指定捕获外部变量的方式,`params`是参数列表,`mutable`表明lambda是否可以修改捕获的变量,`exception`是异常处理,`return_type`是返回类型,`body`是函数体。 Lambda表达式简化了函数对象的创建,特别适用于函数式编程风格和`std::algorithm`库中的算法,如`std::sort`和`std::transform`。 总结,C++11的新特性显著提升了C++的现代性和易用性,使得代码更简洁、安全。`nullptr`增强了空指针的类型安全性,`auto`和`decltype`简化了类型推导,`initializer_list`提供了统一的初始化方式,模板嵌套增强了模板的灵活性,而Lambda表达式则促进了函数式编程风格的采用。这些特性不仅在面试中是考察的重点,也是实际开发中不可或缺的工具。