一.类中新增的默认成员函数:移动赋值和移动构造
二.lambda表达式
三.包装器
bind函数
四.C++类型转换规范
- C语言中,相近类型之间可以发生隐式类型转换(比如
double
和int
),不相近但有兼容性的类型之间可以进行显示强制类型转换(比如指针和整形类型)
- C语言的类型转换可见性不强,容易引发程序的异常行为而且难以调式,因此C++对程序中的类型转换行为进行了规范–要求以函数调用的形式明确标明类型转换
C++ 四种类型转换
dynamic_cast
常用于多态函数调用中父类和子类对象的区分和识别,是专属于C++的特殊类型转换
- 类型转换容易引发错误,应尽量避免
五.关键字volatile
- volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.
volatile
可以解释为直接存取原始内存地址
- 有时编译器为了优化代码,会对一些变量的访问进行特殊编译优化(比如将变量值存入寄存器中,每次只从寄存器中读取该变量),关键字
volatile
可以禁止编译器对某个变量的访问进行特殊编译优化:
void Test()
{
const int a = 2;
int* p = const_cast<int*>(&a);
*p = 3;
cout << a << endl;
}
- 上面的代码段在vs2022中变量
a
的输出结果为2,这是由于编译器会对 const
变量的访问 进行优化(在有些环境下,编译器可能会将const变量的值放入寄存器中方便快速访问),关键字volatile
可以让编译器从内存中正常读取a变量:
void Test()
{
volatile const int a = 2;
int* p = const_cast<int*>(&a);
*p = 3;
cout << a << endl;
}
- 此时变量
a
的输出结果就是3了.
- 当一个变量在程序中被频繁修改和读取时就应该用关键字
volatile
来修饰,常用场景:
- 并行设备的硬件寄存器
- 多线程环境下各线程间共享的标志,应该加volatile
- 中断服务程序中供其它程序检测的变量,需要加volatile