我有以下课程(这不是我真正的课程,但仅用于说明目的):
class Number {
public:
Number() : value_(0) {}
explicit Number(int v) : value_(v) {}
Number(const Number & other){
value_ = other.value_;
}
Number& operator=(const int & v){
value_ = v;
return *this;
}
private:
int value_;
};
我可以执行以下操作,它们都能正常工作:
void test_ok(){
Number x(3);
Number y = Number(3);
Number y2(x);
Number y3 = x;
Number u;
u = 3;
}
但是,下面给出了这个编译器错误:没有合适的构造函数来转换来自" int"到"号码"
void test_error(){
Number z = 3;
}
如果我评论单词" explicit"从第二个构造函数,然后编译器错误消失,显然自动转换工作正常。因为我想保留关键字" explicit",我错过了哪个构造函数?
提前致谢!
答案 0 :(得分:0)
explicit
关键字禁止隐式自动类型转换。在您的测试Number z = 3
中,您正在做的是 - 隐式类型转换,从int
(3)到Number
。编译器理所当然地禁止这样做。
如果您想保留关键字explicit
,那么您必须将Number
对象构建为Number(3)
(因为您已经注意到并写过)。
简而言之,如果您想保留explicit
关键字,则无法使用其他构造函数。无论你做什么,都会禁止隐含的类型转换。