注:内容参考学习 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声明,从而可以阻止编译器执行非预期的不安全的隐式转换,从而避免一些意外错误的发生。