Explicit关键字:阻止隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。
隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。
class String{
public:
explicit String(int n) {};
//String(int n) {};
String(const char *p) {};
};
void main()
{
String s1 = 'a'; // 错误:不能做隐式char->String转换
String s2(10); // 可以:调用explicit String(int n);
String s3 = String(10); // 可以:调用explicit String(int n);再调用默认的复制构造函数
String s4 = "Brian"; // 可以:隐式转换调用String(const char *p);再调用默认的复制构造函数
String s5("Fawlty"); // 可以:正常调用String(const char *p);
}
Mutable关键字:mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。(mutable在类中只能够修饰非静态数据成员)
用例:
class Test
{
public:
Test();
int value() const;
private:
mutable int v;
};
Test::Test()
{
v = 1;
}
int Test::value() const
{
v++; //v若没有mutable关键字修饰,则无法修改v的值
return v;
}
int main()
{
Test A;
cout << A.value() << endl;
return 0;
}
运行结果: 输出 2
volatile关键字:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。