C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称,也称为C++0x。它由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布,并于2011年9月正式出版。
C++11标准对C++98标准做了重大的修正和改进。C++11标准引入了许多新特性,主要包括以下几个方面:
01 智能指针:
C++11引入了智能指针,用于自动管理动态分配的内存。智能指针主要有三种类型:std::unique_ptr(独占智能指针)、std::shared_ptr(共享智能指针或引用计数智能指针)和std::weak_ptr(观察者智能指针)。这些智能指针在超出作用域时会自动释放内存,从而避免了内存泄漏和悬挂指针的问题。
#include <memory>
// 自定义类
class MyClass;
// 创建一个std::shared_ptr智能指针对象。
std::shared_ptr<MyClass> pMyClass = std::make_shared<MyClass>();
02 线程库:
C++11引入了线程库,用于支持多线程编程。线程库提供了多种类和函数,包括std::thread(线程类)、std::mutex(互斥类)、std::condition_variable(条件变量类)等,用于创建和管理线程、同步线程以及等待线程完成等操作。
03 随机数生成器:
C++11引入了随机数生成器,用于生成各种类型的随机数。随机数生成器位于头文件中,主要包括std::random_device、std::mt19937和各种分布函数。下面看一个生成随机数的例子:
#include <random>
// 生成随机数例子。
std::random_device rd;
std::mt19937 gen(rd());
int iValue = gen(); // 生成随机数
04 基于范围for循环:
C++11引入了基于范围for循环(range-based for loop),用于遍历数组、容器等数据结构。范围for循环的语法如下:
// 语法:
for (auto element : container) {
// 循环体
}
// 其中,container是要遍历的容器,element是容器中的每个元素。
// 例子:
#include <vector>
std::vector<int> vecDatas;
for (int v : vecDatas)
{
// 循环体
}
05 lambda表达式:
C++11引入了lambda表达式,用于定义匿名函数。lambda表达式可以捕获其所在作用域中的变量,并使用这些变量在lambda函数体中定义操作。以下是一个lambda表达式的使用例子:
#include <vector>
#include <algorithm>
// 创建一个存储int的动态数组vector。
std::vector<int> vecValues{22,33,11};
// 利用lambda表达式对vector降序排序。
std::sort(vecValues.begin(), vecValues.end(), [](int a, int b)
{
return a > b;
}
);
06 右值引用和移动语义:
C++11引入了右值引用和移动语义,用于优化资源管理。右值引用和移动语义可以避免资源泄漏和拷贝操作,提高程序的性能和安全性。
07 类型推导:
C++11引入了类型推导(type deduction),使用关键字auto来自动推导变量的类型。这可以提高代码的可读性和可维护性。
#include <map>
#include <string>
std::map<int, std::string> mapDatas;
// ...
// 以下auto使用自动推导特性。
auto iter = mapDatas.find(1);
if (mapDatas.end() != iter)
{
// ...
}
08 追踪返回类型:
C++11引入了追踪返回类型(trailing return type),允许在函数声明中指定返回类型,而不是在函数名之前。这可以提高代码的可读性和可维护性。
09 nullptr:
C++11引入了新的空指针常量nullptr,用于表示空指针。nullptr比NULL更加安全,因为它是一个常量表达式,不能被隐式转换为整数类型。记得以后不要再使用NULL了。
// 自定义类
class MyClass;
// 类指针初始nullptr
MyClass* pMyClass = nullptr;
10 长整数类型:
C++11引入了新的长整数类型long long(64位长整数),它能够表示比int和long类型更大的整数。
11 静态断言:
C++11引入了静态断言static_assert,用于在编译时检查条件是否为真。如果条件为假,则编译器会生成错误信息。
12 外部模板:
C++11引入了外部模板(extern template),允许在头文件中声明模板,并在其他文件中定义它们。这可以提高编译速度并减少重复代码。
13 列表初始化:
C++11引入了列表初始化语法(list initialization),允许使用大括号{}来初始化变量和容器。这种语法比传统的赋值语法更加清晰和安全。来看几个例子:
#include <map>
std::map<int, float> mapDatas;
// 传统方式插入数据
mapDatas.insert(std::pair<int, float>(1, 1.25));
// 或者下面这种
mapDatas.insert(std::make_pair(1, 1.25));
// C++11方式插入数据
mapDatas.insert( { 1, 1.25 } );
// 传统的初始化
double dValue = 1.25;
// C++11支持这种初始化
double dValue {1.25};
14 新容器:
C++11引入了一些新的容器,包括std::unordered_map(无序关联容器,基于哈希表实现)、std::unordered_set(无序集合,基于哈希表实现)、std::forward_list(单向链表)等。这些容器提供了更加灵活和高效的数据结构选择。
15 新算法:
C++11引入了一些新的算法,如std::copy_if、std::move_if等,用于执行特定的操作。
16 并行算法:
C++11开始支持并行算法,可以利用多核处理器进行计算加速。一些标准算法如sort,、find等已经支持并行版本。
C++11标准是C++编程语言的重要里程碑之一,为开发者提供了更强大和灵活的工具,以应对现代软件开发中的各种挑战。这里只列出一些相对实用的C++11标准,更多标准特性与描述,请查看国际标准化组织(ISO)官网介绍。
-【End】-
#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。
喜欢本文章,记得点赞、分享、关注哦~