注:内容参考学习 Leetcode 上的《C++面试突破》
一、作用
用来声明类构造函数是显示调用的,而非隐式调用,可以阻止调用构造函数时进行隐式转换和赋值初始化。注意:只可用于修饰单参构造函数,因为无参构造函数和多参构造函数本身就是显式调用的,再加上explicit关键字也没有意义。
二、例子
class A
{
public:A(int n){v = n;}
private:int v;
};
int main(int argc, char *argv[])
{A a = 10; //发生了隐式转换return 0;
}
在上面例子中,A a = 10; 在编译时,进行了隐式转换,将10转换成A类型的对象,然后将该对象赋值给a, 等同于以下代码
A tmp(10);
A a = tmp;
为了避免隐式转换,可用explicit 关键字进行声明:
class A
{
public:explicit A(int n) //添加explicit关键字{v = n;}
private:int v;
};
int main(int argc, char *argv[])
{A a = 10; //此时提示编译错误:error: C2440: “初始化”: 无法从“int”转换为“A”return 0;
}
三、总结
在日常使用中建议对单参构造函数使用explicit声明,从而可以阻止编译器执行非预期的不安全的隐式转换,从而避免一些意外错误的发生。