如果类具有带一个参数的构造函数,或是如果除了一个参数之外的所有参数都具有默认值,则参数类型可以隐式转换为类类型(这样的构造函数也叫做隐式构造函数)。 例如,如果 Box 类具有一个类似于下面这样的构造函数:
Box(int size): m_width(size), m_length(size), m_height(size){
}
可以初始化 Box,如下所示:
Box b = 42;
或将一个 int 传递给采用 Box 的函数:
class ShippingOrder
{
public:
ShippingOrder(Box b, double postage) : m_box(b), m_postage(postage){
}
private:
Box m_box;
double m_postage;
}
//elsewhere...
ShippingOrder so(42, 10.8);
这类转换可能在某些情况下很有用,但更常见的是,它们可能会导致代码中发生细微但严重的错误。 作为一般规则,应使用explicit 在构造函数 (和用户定义的运算符) 上使用关键字,以防止这种隐式类型转换:(也就是显式构造函数)
explicit Box(int size): m_width(size), m_length(size), m_height(size){
}
构造函数是显式函数时,此行会导致编译器错误:ShippingOrder so(42, 10.8);