我是C ++的新手,我试图了解Class的工作原理。当我遇到这个问题时,我为自己做了一个简单的例子。我的班级有一个私人财产num
,我试图用这种方式用int初始化它:Number one = Number::ONE;
但它不起作用。但是,当我这样做时,它可以正常工作:Number one; one = Number::ONE
。我更喜欢第一种选择。请帮忙!
这是我的完整代码:
class Number {
public:
enum {ONE, TWO, THREE, FOUR};
Number();
void print() const;
Number& operator=(int);
private:
int num;
};
Number& Number::operator=(int n) {
num = n;
return *this;
}
int main(int argc, const char * argv[]) {
Number n = Number::ONE; // doesn't work :(
n.print();
return 0;
}
Number::Number() {
num = 0;
}
void Number::print() const {
cout << num << endl;
}
答案 0 :(得分:5)
在C ++中,当你写
时Number one = Number::ONE;
编译器不使用赋值运算符初始化one
。仅当您具有要重新分配新值的现有对象时,才会调用operator=
函数。相反,在这种情况下,编译器会尝试调用转换构造函数,这是一个构造函数,它接受相等性右侧的类型对象。由于您尚未定义类似的构造函数,因此会出现编译器错误。
这样做的一种方法是:
class Number {
public:
Number(int value); // <-- Conversion constructor
...
};
Number::Number(int value) {
num = value;
}
现在,您在此处提供的代码将正确编译。
您可能希望对复制构造函数,赋值运算符,转换构造函数和转换赋值运算符进行一些阅读,因为它们是常规C ++中较为棘手的部分之一,并且经常会让人们从基本的C ++过渡到更中间的 - 水平语言技巧。
答案 1 :(得分:1)
你没有重载构造函数以取整数作为参数,这就是你得到错误的原因:
class Number
{
public:
enum {ONE, TWO, THREE, FOUR};
Number(int x) : num(x){}
void print() const;
Number& operator=(int);
private:
int num;
};