JS *_*ter 2 c++ initialization assignment-operator
我是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;
}
Run Code Online (Sandbox Code Playgroud)
在C++中,当你写
Number one = Number::ONE;
Run Code Online (Sandbox Code Playgroud)
编译器不会使用赋值运算符进行初始化one.operator=仅当您具有要重新分配新值的现有对象时,才会调用该函数.相反,在这种情况下,编译器会尝试调用转换构造函数,这是一个构造函数,它接受相等性右侧的类型对象.由于您尚未定义类似的构造函数,因此您将收到编译器错误.
一种方法是这样的:
class Number {
public:
Number(int value); // <-- Conversion constructor
...
};
Number::Number(int value) {
num = value;
}
Run Code Online (Sandbox Code Playgroud)
现在,您在此处给出的代码将正确编译.
您可能希望对复制构造函数,赋值运算符,转换构造函数和转换赋值运算符进行一些阅读,因为它们是常规C++中较为棘手的部分之一,并且经常会让人们从基本的C++过渡到更多的中级语言技术.