我正在从一本书中学习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)
{}
答案 0 :(得分:2)
如果没有此构造函数:
counter(int value);
那么您将无法执行以下操作:
int n = 3;
counter c = counter{n};
counter c = counter{1};
counter c = 2;
// etc ...
operator+
的问题在于,当您将int
值itsValue + 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
。您尚未定义析构函数,但已提供了声明。只需删除声明,因为隐式生成的析构函数就足够了。