C++11是C++的一个版本,它通过引入一系列新的语言特性、库和改进来增强了语言的表达能力和可用性。本文将介绍C++11的主要新特性。
C++11中引入了auto关键字,它可以用于声明变量时自动推导变量类型。例如:
auto x = 10; // 推导出x的类型为int
auto y = 3.14; // 推导出y的类型为double
此外,C++11还引入了统一初始化语法,它可以用于对象的初始化。例如:
int a{10}; // 初始化a为10
std::vector<int> v{1, 2, 3}; // 初始化v为包含1、2、3三个元素的vector
这种语法可以避免某些初始化问题,例如在使用花括号包围的列表初始化时,如果存在缩窄转换(即可能导致信息丢失的转换),编译器会报错。
C++11中引入了range-based for循环,它可以遍历容器中的元素或迭代器所指向的区域。例如:
std::vector<int> v{1, 2, 3};
for (auto i : v) {
std::cout << i << std::endl; // 输出1、2、3
}
这种语法使遍历容器更加简洁和易读。
C++11中引入了lambda表达式,它可以用于定义匿名函数。例如:
auto f = [](int x, int y) { return x + y; };
std::cout << f(1, 2) << std::endl; // 输出3
这种语法可以简化代码,并且在某些情况下可提高效率。
C++11中引入了关键字extern template,它可以将模板声明和定义分离。这样,在编译期间可以只编译模板声明,并在链接期间编译模板定义,从而提高编译速度。
C++11中引入了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。它们可以自动管理动态分配的内存,从而避免内存泄漏。
C++11中引入了两种新的容器类型:std::array和std::unordered_map。std::array是一个固定大小的数组,类似于C语言中的数组。std::unordered_map是一个无序容器,它使用哈希表实现。
C++11中引入了右值引用和移动语义,它们可以避免不必要的内存拷贝和分配。右值引用可以绑定到临时对象或表达式的结果,例如:
std::string str = "Hello, World!";
std::string&& rstr = std::move(str); // 将str的所有权转移给rstr
移动语义可以将一个对象的状态转移给另一个对象,而不需要进行拷贝操作。例如:
std::vector<int> v{1, 2, 3};
std::vector<int> v2 = std::move(v); // 将v的所有元素转移到v2
这种语法可以提高程序的效率,尤其是在处理大量数据或复杂对象时。
C++11中引入了多线程支持库,它包括std::thread、std::mutex、std::condition_variable等类和函数。这些工具可以方便地进行线程创建、同步和互斥操作。
C++11中增强了类型检查机制,例如禁止隐式的类型转换、禁止narrowing conversion(可能导致信息丢失的转换)等。这样可以减少程序中的类型错误和安全问题。
总结
上述就是C++11的一些重要新特性。C++11通过引入这些特性和改进来增强了语言的表达能力、可读性和可用性。这些特性为编写更加清晰、可读、高效和安全的代码提供了支持。