一、explicit
声明为explicit的构造函数不能在隐式转换中使用。
- 不加explicit
#include<iostream>
using namespace std;
class Test
{
public:
Test(int i=5)
{
s=i;
}
private:
int s;
};
int main()
{
Test a;
a=10;//可以把内置的int类型赋值给了对象a
//实际上,10被隐式转换成了下面的形式,所以才能这样.
//a = Test temp(10);
return 0;
}
-
加explicit
二、volatile -
防止多线程缓存共享变量 保证多线程程序内存的可见性
可见性 一致性 原子性 -
防止编译器对指令顺序进行优化
编译器的优化:
-
在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值;
-
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
-
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致
-
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致
三、mutable
如果一个函数被const 修饰(常成员函数),那么它将无法修改其成员变量的,但是如果这个成员变量是被mutable修饰的话,则可以修改。
- 不加mutable
- 加mutable