【问题标题】:How to overload operator= used in initializing a new object?如何重载用于初始化新对象的 operator=?
【发布时间】:2017-04-07 20:07:41
【问题描述】:

我是 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;
}

【问题讨论】:

  • 您不需要为您正在做的事情重载赋值运算符吗?只需制作一个 mutator 函数。
  • int changeNum (enum x) { 返回你的枚举 }

标签: c++ initialization assignment-operator


【解决方案1】:

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

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

    void print() const;

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

【讨论】:

  • 多谢大佬,我终于明白了!
【解决方案2】:

在 C++ 中,当你编写时

Number one = Number::ONE;

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

一种方法是这样的:

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

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

现在,您在此处给出的代码将正确编译。

您可能需要对复制构造函数、赋值运算符、转换构造函数和转换赋值运算符进行一些了解,因为它们是常规 C++ 中比较棘手的部分之一,并且经常使人们从基本 C++ 过渡到更中间的 C++ -水平语言技巧。

【讨论】:

  • 我相信我现在明白了如何使用转换构造函数,但是如果我仍然希望以这种方式初始化对象怎么办,Number one = Number::ONE 有办法吗?谢谢!
  • 我相信转换构造函数是这样做的。
  • @JS starter - 以这种方式调用转换构造函数,除非它被声明为explicit。所以Number one = Number::ONE 将调用一个构造函数,其参数为Number::ONE
  • @templatetypedef 构造函数通常最好使用初始化列表而不是在其主体中分配值。在您的情况下,它将是Number::Number(int value) : num(value) {}。除其他外,这避免了初始化然后分配成员。对于类类型的成员,它还提供异常安全性,而在构造函数主体中分配(通常)不会。
  • @Peter 哦,当然。我选择了另一条路线,因为我不确定 OP 对初始化列表有多熟悉,并且不想将太多概念放入一个答案中。
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多