C++中,被explicit限定的构造函数,在创建对象时不支持隐式类型转换,只能显示转换类型。
若没有explicit限定,创建对象时可以使用隐式类型转换:
class Shape
{
public:
Shape(float r) : Radius(r) {} //圆--方法1
Shape(const Shape& shape) : Radius(shape.Radius) {} //圆--方法2
private:
float Radius=1;
};
int main()
{
Shape circle_1 = 1.5f; //调用方法1
Shape circle_2 = circle_1; //调用方法2
Shape circle_3(circle_2); //调用方法2
std::cin.get();
}
用explicit限定构造方法后:
class Shape
{
public:
explicit Shape(float r) : Radius(r) {} //圆--方法1
explicit Shape(const Shape& shape) : Radius(shape.Radius) {} //圆--方法2
private:
float Radius=1;
};
int main()
{
//此时1.5f无法隐式调用构造方法1
Shape circle_1 = 1.5f; //报错
//同理,因为方法2也不能隐式调用,所以不能直接赋值
Shape circle_2 = circle_1; //报错
//正确的调用方法
Shape circle_3(1.5f); //调用方法1
Shape circle_4(circle_3); //调用方法2
std::cin.get();
}