如何重载operator =用于初始化一个新对象?

时间:2016-11-23 17:30:06

标签: 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;
}

2 个答案:

答案 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;
};