C++ explicit的作用

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

你可能感兴趣的:(c++,开发语言)