| 当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数,例如, class Box {
public:
    Box(int val) {   
        cout << "转换构造函数";
    }
};
 转换构造函数常发生在隐式调用一个构造函数接收一个不同于其类类型的形参,可以视为将其形参转换成类的一个对象,例如,
 int main()
{
    Box a = 23; 
    Box b(23); 
    return 0;
}
 输出: 转换构造函数
转换构造函数
 以上两种方法都调用了相同的转换构造函数,若没有定义该构造函数,将会报错。但Box a = 23;这种方法并不推荐。 再比如 void fun(Box box);
fun(5);
 class Box {
public:
    int val;
    Box(int i) {
        val = i;
        cout << "调用转换构造函数"<<endl;
    }
    int getVal() {
        return val;
    }
};
void func(Box val)
{
    Box b = val;
    cout<<b.getVal()<<endl;
}
int main()
{
    func(5);
    return 0;
}
 输出: 调用转换构造函数
5
 这样调用是没有问题的,隐式类型转换会把1转换成Box的对象。同样地
 Box func(int val)
{
    return val;
}
 class Box {
public:
    int val;
    Box(int i) {
        val = i;
        cout << "调用转换构造函数"<<endl;
    }
    int getVal() {
        return val;
    }
};
Box func(int val)
{
    return val;
}
int main()
{
    Box b = func(5);
    cout <<b.getVal()<<endl;
    return 0;
}
 输出: 调用转换构造函数
5
 为了防止类似Box a=23的隐式调用,可以使用explicit 关键字 class Box
{
	public:
		explicit Box(int val);
};
Box box = 1;
Box box(2);
 转换构造函数常发生在隐式调用,因此也就有了explicit关键字 |