如何重载用于初始化新对象的运算符=?

How to overload operator= used in initializing a new object?

我是 C++ 的新手,我想了解 Class 的工作原理。我遇到这个问题给自己做了一个简单的例子。我的 class 有一个 private 属性 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;
}

在 C++ 中,当您编写

Number one = Number::ONE;

编译器将不会使用赋值运算符来初始化oneoperator= 函数仅在您有一个要重新分配新值的现有对象时调用。相反,在这种情况下,编译器会尝试调用 转换构造函数 ,该构造函数接受等式右侧类型的对象。由于您没有定义这样的构造函数,因此会出现编译器错误。

一种方法是这样的:

class Number {
public:
     Number(int value); // <-- Conversion constructor
     ...
};

Number::Number(int value) {
    num = value;
}

现在,您在此处提供的代码将可以正确编译。

您可能想阅读一下复制构造函数、赋值运算符、转换构造函数和转换赋值运算符,因为它们是常规 C++ 中比较棘手的部分之一,并且经常使人们从基本 C++ 过渡到更多中级语言技巧。

您没有重载构造函数以将整数作为参数,这就是您收到错误的原因:

class Number 
{
    public:
        enum {ONE, TWO, THREE, FOUR};
        Number(int x) : num(x){}

    void print() const;

    Number& operator=(int);
private:
    int num;
};