
本文共 7150 字,大约阅读时间需要 23 分钟。
C++11 新特性解析
C++11 是 C++语言的重要一次重大升级,带来了诸多有力功能和改进,极大地提升了语言的灵活性和实用性。本文将对 C++11 的新特性进行系统性介绍,涵盖从基础到高级功能的核心内容。
1. auto & decltype
C++11 引入了 auto
和 decltype
关键字,为程序员提供了更强大的类型推导能力。
auto:用于在编译器阶段推导变量类型,常用于简化代码。例如:
auto a = 10; // a 会被推导为 int 类型
decltype:用于推导表达式的类型,仅用于编译期分析,不会执行实际运算。例如:
int i = 1; int a = 2; decltype(i) b = 2; // b 的类型为 const int*
应用场景:
auto
和decltype
广泛应用于 lambda 表达式、函数模板等场景,极大提升了代码的简洁性和可读性。
2. 左值与右值
C++11 引入了对左值和右值的明确划分,为函数参数和资源管理带来革命性变化。
- 左值:可以取地址且具有名字的对象。
- 右值:无法取地址且没有名字的对象,包括纯右值和将亡值。
- 左值引用和 右值引用:分别用于引用左值和右值的类型。
- 移动语义:允许通过转移资源所有权简化内存管理。
- 完美转发:通过函数模板实现任意实参的转发。
- 返回值优化:减少临时对象的复制,提升性能。
3. 列表初始化
C++11 提供了更加灵活的对象初始化方式,支持直接在变量名后添加初始化列表。
聚合类型:支持直接使用初始化列表进行初始化,例如:
struct A { public: A(int) {} };int main() { A a{1, 2, 3}; // 错误,A 有自定义构造函数无法使用初始化列表 A d{123}; return 0;}
规则:初始化列表只能用于聚合类型或自定义构造函数的类。例如:
struct A { A(int, int) {} };int main() { A a(123); // 正常 A b = 123; // 错误 A c = { 123 }; // 正常}
std::initializer_list:用于实现任意长度的初始化列表,常用于自定义容器。
4. std::function & std::bind & lambda 表达式
C++11 引入了 std::function
、std::bind
和 lambda 表达式,简化了函数调用和逻辑。
- std::function:支持任意函数类型的调用,适合高层次编程。
- std::bind:用于绑定函数和参数,简化代码书写。
- lambda 表达式:允许在代码中定义匿名函数,提升代码灵活性。
5. 模板的改进
C++11 对模板进行了多方面改进,包括模板别名、右尖括号和默认模板参数。
- 模板右尖括号:支持在模板定义中使用
>>
表示模板参数。 - 模板别名:允许为模板定义别名,提升代码可读性。
- 默认模板参数:简化模板函数的调用。
6. 并发与并行
C++11 提供了强大的并发和并行支持,涵盖线程、互斥、信号和原子操作等。
- std::thread:支持多线程编程。
- std::mutex 和 std::lock:实现互斥和锁机制。
- std::atomic:提供原子操作,确保多线程安全。
- std::call_once:确保函数只在第一次调用时执行。
- std::future 和 std::async:支持异步编程和非阻塞 IO。
7. 智能指针
C++11 引入了三种智能指针,提升内存管理的安全性和效率。
- std::shared_ptr:支持共享指针,适合复杂的内存管理。
- std::weak_ptr:弱引用,避免内存泄漏。
- std::unique_ptr:独占指针,确保资源唯一性。
8. 基于范围的 for 循环
C++11 引入了基于范围的 for 循环,简化了迭代操作。
- 示例:
for (auto iter : vec) { // 传统 for 循环 // 假设 vec 是一个容器}for (int i : vec) { // 基于范围的 for 循环 // 逐个遍历 vec 中的元素}
9. 组合构造函数(Delegating Constructors)
允许在同一类中调用另一个构造函数,简化对象初始化。
示例:
struct A { A() {} A(int a) { a_ = a; } A(int a, int b) : A(a) { b_ = b; } A(int a, int b, int c) : A(a, b) { c_ = c; } int a_, b_, c_;}
使用委托构造函数:
struct A { A() {} A(int a) { a_ = a; } A(int a, int b) : A(a) { b_ = b; } A(int a, int b, int c) : A(a, b) { c_ = c; } int a_, b_, c_;}
10. 继承构造函数(Inhiting Constructors)
允许派生类直接使用基类的构造函数,简化代码编写。
- 示例:
struct Base { Base() {} Base(int a) { a_ = a; } Base(int a, int b) : Base(a) { b_ = b; } Base(int a, int b, int c) : Base(a, b) { c_ = c; } int a_, b_, c_;}struct Derived : public Base { using Base::Base; // 继承构造函数}
11. nullptr
C++11 引入了 nullptr
替代 NULL
,提升代码的安全性和可读性。
- 示例:
void func(void *ptr) { cout << "func ptr" << endl;}void func(int i) { cout << "func i" << endl;}int main() { func(NULL); // 编译错误 func(nullptr); // 输出 "func ptr" return 0;}
12. final & override
C++11 提供了 final
和 override
关键字,提升代码的安全性和可维护性。
- final:修饰类,禁止进一步派生和虚函数重载。
- override:修饰派生类中的成员函数,确保函数重写基类函数。
13. default
C++11 引入了 default
关键字,用于显式声明默认构造函数。
- 示例:
struct A { A() = default; A(int i) { a = i; } int a;}int main() { A a; // 正常,编译通过 return 0;}
14. delete
C++11 提供了 delete
操作符,用于禁止拷贝和赋值操作。
- 示例:
struct A { A() = default; A(const A &) = delete; A & operator=(const A &) = delete; int a;}int main() { A a1; // 正常 A a2 = a1; // 错误 return 0;}
15. explicit
C++11 引入了 explicit
关键字,用于修饰构造函数,禁止隐式转换。
- 示例:
struct A { explicit A(int value) { a = value; } int a;}int main() { A a = 1; // 错误 A aa(2); // 正常 return 0;}
16. const
const
关键字用于定义只读常量或变量,提升代码的安全性和一致性。
- 常量:定义不变的值,确保代码安全。
- 指针:确保指针不被修改。
- 成员函数:防止函数修改成员变量。
- 类对象:确保对象的成员函数不被修改。
17. constexpr
constexpr
是 C++11 新引入的关键字,用于编译时常量和常量函数。
- 与 const 的区别:
const
表示运行时只读,constexpr
表示编译时常量。 - 应用场景:常数值和函数返回值。
18. enum class
C++11 引入了有作用域的枚举类型,提升代码的安全性和可维护性。
- 示例:
enum class AColor { kRed, kGreen, kBlue };enum class BColor { kWhite, kBlack, kYellow };int main() { if (AColor::kRed == BColor::kWhite) { // 编译错误 cout << "red == white" << endl; } return 0;}
19. 非受限联合体
C++11 取消了对 POD 类型的限制,允许联合体包含非 POD 类型。
- 示例:
struct A { int a; int *b;}union U { A a; int b;}
20. sizeof
C++11 扩展了 sizeof
的使用范围,支持数据成员的大小查询。
- 示例:
struct A { int data[10]; int a;}int main() { A a; cout << "size of data: " << sizeof(A::data) << endl; return 0;}
21. static_assert
C++11 引入了 static_assert
声明,用于编译期检查条件。
- 示例:
static_assert(true, "错误信息");
22. 自定义字面量
C++11 提供了对字面量的定义,提升代码的灵活性和美观性。
- 示例:
struct mytype { unsigned long long value;}constexpr mytype operator"" _mytype(unsigned long long n) { return mytype{n};}mytype mm = 123_mytype;
23. thread_local
C++11 引入了 thread_local
关键字,用于定义线程本地变量。
- 示例:
struct A { thread_local int count = 0; void test(const std::string &name) { ++count; cout << name << ": " << count << endl; }}int main() { std::thread func = std::thread([this]() { func(const std::string{"thread1"}); // 输出 thread1: 1 func(const std::string{"thread1"}); // 输出 thread1: 2 }); func.join(); std::thread func2 = std::thread([this]() { func(const std::string{"thread2"}); // 输出 thread2: 1 func(const std::string{"thread2"}); // 输出 thread2: 2 }); func2.join(); return 0;}
24. 基础数值类型
C++11 引入了新的基础数值类型,提升数据精度和范围。
- 新增类型:
char16_t
、char32_t
、intmax_t
等。
25. 随机数功能
C++11 提供了丰富的随机数分布类型,支持高级概率计算。
- 示例:
#include
int main() { std::default_random_engine random(time(nullptr)); std::uniform_int_distribution dis(0, 100); std::uniform_real_distribution disFloat(0.0, 1.0); for (int i = 0; i < 10; ++i) { cout << dis(random) << ' '; } cout << endl; for (int i = 0; i < 10; ++i) { cout << disFloat(random) << ' '; } cout << endl; return 0;}
26. 正则表达式
C++11 提供了强大的正则表达式支持,提升文本处理能力。
- 示例:
#include
int main() { std::regex word_regex("(\\w+)"); std::sregex_iterator words_begin(s.begin(), s.end(), word_regex); std::sregex_iterator words_end; std::cout << "Found " << std::distance(words_begin, words_end) << " words\n"; const int N = 6; std::cout << "Words longer than " << N << " characters:\n"; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; std::string match_str = match.str(); if (match_str.size() > N) { std::cout << " " << match_str << '\n'; } } std::regex long_word_regex("(\\w{7,})"); std::string new_s = std::regex_replace(s, long_word_regex, "[$&]"); std::cout << new_s << '\n'; return 0;}
27. chrono
C++11 引入了 chrono
库,支持高精度时间测量和管理。
核心组件:
duration
、time_point
、clocks
。示例:
#include
int main() { using std::chrono::system_clock; system_clock::time_point today = system_clock::now(); std::time_t tt = system_clock::to_time_t(today); std::cout << "today is: " << ctime(&tt) << '\n'; return 0;}
28. 新增数据结构
C++11 引入了多个新数据结构,提升容器的性能和功能。
std::forward_list
:单向链表,性能优于std::list
。std::unordered_set
和std::unordered_map
:基于哈希表的集合和映射。std::array
:固定大小数组,避免越界。std::tuple
:多元组件类型,支持灵活数据存储。
29. 新增算法
C++11 引入了多个高效算法,提升数据处理能力。
std::all_of
、std::any_of
、std::none_of
:数组元素检验。std::copy_if
、std::iota
:数据复制和初始化。std::minmax_element
:数组极值查找。
通过以上内容可以看出,C++11 的新特性不仅提升了语言的功能性,也为程序员提供了更高效、更安全的编程方式。这些特性在现代 C++ 开发中发挥着重要作用,极大地简化了代码编写和优化了性能。
发表评论
最新留言
关于作者
