C++常用关键字
一.通用关键字
1.inline:优化函数调用,减少调用开销,将函数体直接嵌入调用点。
- 适用于小型、频繁调用的函数(如工具函数、简单数学运算)。
- 在头文件中定义函数时,避免多重定义错误。
2. noexcept:指明函数不会抛出异常,便于编译器优化和提高代码安全性。
- 明确不会抛出异常的函数(如析构函数、移动构造函数)。
- 与 STL 配合,优化性能。
3. auto:自动分配类型,相当于C#中的var
4.vector
std::vector是一个功能强大的动态数组容器,适用于大多数需要动态大小的场景。- 提供了丰富的操作函数,支持高效的随机访问和与 STL 算法的无缝结合。
- 在需要频繁插入和删除的场景中,可以考虑使用
std::list或std::deque。 -
-
std::vector:- 数据是连续存储的,可以通过下标快速访问。
- 当容量不足时,会重新分配更大的内存块,并将所有元素复制到新内存中。
-
std::list: - 数据是分散存储的,每个节点包含元素和指向前后节点的指针。
- 插入和删除时只需要调整指针,不会影响其他节点。
-
5.reinterpret_cast
reinterpret_cast是一种强大的类型转换工具,但它类型不安全,可能导致未定义行为。- 它适用于底层开发场景,如硬件交互、网络协议处理、位操作等。
- 在普通应用程序中,应尽量避免使用,并优先选择更安全的类型转换运算符(如
static_cast和dynamic_cast)。 - 使用时需要非常谨慎,确保转换是有意义的且不会引发未定义行为。
-
类型转换 特点 适用场景 static_cast编译时类型检查,适用于相关类型之间的转换。 基本类型之间的转换(如 int到float),或具有继承关系的类之间的转换。dynamic_cast运行时类型检查,仅适用于具有多态( virtual)的类。用于检查和转换父类与子类之间的类型。 const_cast用于移除或添加 const限定符。需要修改 const对象或指针的场景。reinterpret_cast类型不安全,允许在完全不相关的类型之间进行转换。 底层开发中,处理指针、位操作、字节流等低级操作。
6.make_unique
std::make_unique是一种安全、高效、简洁的方式来创建std::unique_ptr。- 它支持通过参数包
Args&&...将参数转发给目标类型的构造函数。 - 对于数组类型,
std::make_unique只能创建默认构造的数组。 - 它能够避免手动管理动态内存带来的复杂性和潜在错误,是现代 C++ 编程的推荐做法。
6.unordered_set
std::unordered_set是一个高效的无序集合,适用于需要快速插入、删除和查找的场景。- 它以哈希表为底层实现,依赖哈希函数和相等比较函数来管理元素。
- 与
std::set相比,std::unordered_set提供更快的操作(平均情况下),但不保证元素的顺序。 - 在存储自定义类型时,可以为
std::unordered_set提供自定义的哈希函数和比较函数。
7.call_once
std::call_once是一个线程安全的工具,用于确保某段代码只执行一次。- 它与
std::once_flag配合使用,适用于线程安全的单例模式、资源加载等场景。 - 相比手动锁管理,更加简洁和高效,推荐在需要“只执行一次”的场景中使用。
8.emplace_back
emplace_back是 C++11 中引入的高效方法,用于直接在容器内构造元素。- 它避免了对象的额外拷贝或移动操作,适合插入复杂对象或需要高性能的场景。
- 在现代 C++ 编程中,推荐优先使用
emplace_back,而不是传统的push_back,特别是在需要构造新对象时。
9.&
| 用途 | 含义 |
|---|---|
| 地址运算符 | 获取变量的地址:int* ptr = &a; |
| 引用声明 | 声明一个引用:int& ref = a; |
| 按引用传递参数 | 函数参数按引用传递:void func(int& x); |
| 按位与运算符 | 按位与操作符:int result = a & b; |
| 声明指针引用类型 | 传递指针的引用:void func(int*& ptr); |
| 右值引用结合 | 区分左值引用和右值引用:foo(int& lref) 和 foo(int&& rref) |
| 模板类型推导 | 用于区分模板中左值引用和右值引用:checkType(T& x) 和 checkType(T&& x) |
| 特性 | 左值引用 | 右值引用 |
|---|---|---|
| 符号 | & |
&& |
| 绑定对象 | 左值 | 右值 |
| 用途 | 修改和操作已有对象 | 移动语义、资源转移 |
| 生命周期 | 可绑定到持久对象 | 绑定到临时对象 |
| 是否可修改 | 通常可修改 | 通常可修改 |
10.using
| 用法场景 | 描述 |
|---|---|
| 类型别名 | 定义类型别名,替代 typedef。 |
| 模板别名 | 定义模板别名,简化模板类型的使用。 |
| 命名空间别名 | 为命名空间创建别名,简化长命名空间的使用。 |
| 引入特定成员 | 从命名空间中引入特定成员,避免使用前缀。 |
| 引入整个命名空间 | 引入整个命名空间,简化代码书写(需谨慎使用)。 |
| 类成员可见性控制 | 在派生类中让基类的某些成员可见。 |
| 重载函数的引入 | 在派生类中引入基类的所有重载函数,避免隐藏。 |
| 控制访问权限 | 改变基类成员的访问权限(如将 protected 提升为 public)。 |
11.

浙公网安备 33010602011771号