# explicit修饰符

# 为什么引入explicit关键字?

在没有显式函数说明符explicit的情况下, 构造函数有时候会变成转换构造函数,在编程过程中发生隐式的类型转换,有时候可能并不是我们需要的。

explitct关键字的引入就是为了修饰构造函数,使得其不会进行隐式的类型转换。

# 示例

#include <iostream>

class Box {
    public:
        Box(int x, int y=0)
        {
            x_ = x;
            y_ = y;
        }

        int x_;
        int y_;
};

void printBox(const Box &b) {
    std::cout << b.x_ << " " << b.y_ << std::endl;
}

int main(int argc, char **argv)
{
    Box b1 = 1;
    std::cout << b1.x_ << " " << b1.y_ << std::endl; // 1, 0
    Box b2 = (1,2);
    std::cout << b2.x_ << " " << b2.y_ << std::endl; // 2, 0
    printBox(2); // 2, 0
    return 0;
}

在以上代码的main函数中,Box b1 = 1;Box b2 = (1,2);printBox(2);都会让代码阅读者感到十分困惑,虽然能正常编译,但者违反了C++是强类型语言的特征。

为了避免其进行隐式的数据类型转换,可在Box类的构造函数前加上explicit修饰。

class Box {
    public:
        explicit Box(int x, int y=0)
        {
            x_ = x;
            y_ = y;
        }

        int x_;
        int y_;
};

加上explicit后,上述代码编译的时候就会报错

invalid initialization of reference of type ‘const Box&’ from expression of type ‘int’

# reference