重载运算符+构造函数问题

时间:2020-10-13 22:20:15

标签: c++ oop operators

我正在从一本书中学习C ++,我发现引用和运算符重载确实很困难。在研究运算符重载时,我不明白为什么如果没有以整数为参数的构造函数,该程序将无法运行。

#include <iostream>
using namespace std;

class counter {
public:
    counter();
    counter(int value);
    ~counter();
    int getValue() const { return itsValue;  }
    int setValue(int value) { itsValue = value;  }
    counter operator+(const counter&);
private:
    int itsValue;
};
counter::counter() :
    itsValue(0)
{}
counter::counter(int value) :
    itsValue(value)
{}
counter counter::operator+(const counter& rhs) {
    return itsValue + rhs.getValue();
}
int main()
{
    std::cout << "Hello World!\n";
}

我不明白为什么在没有这些行的情况下该程序无法运行:

counter(int value);

AND

counter::counter(int value) :
        itsValue(value)
    {}

1 个答案:

答案 0 :(得分:2)

如果没有此构造函数:

counter(int value);

那么您将无法执行以下操作:

int n = 3;
counter c = counter{n};
counter c = counter{1};
counter c = 2;
// etc ...

operator+的问题在于,当您将intitsValue + rhs.getValue()转换为返回类型的counter时,您所做的正是:

counter counter::operator+(const counter& rhs) {
  return itsValue + rhs.getValue();
}

如果没有适当的构造函数,就无法从counter来构建int,并且会出错。


通过手动构造int对象并返回该对象,可以选择不提供counter构造函数:

counter counter::operator+(const counter& rhs) const {
    counter c;
    c.itsValue = itsValue + rhs.getValue();
    return c;
}

请注意,operator+应具有const的资格。

这里是demo


其他一些修复:setValue应该返回void。您尚未定义析构函数,但已提供了声明。只需删除声明,因为隐式生成的析构函数就足够了。