我正在为学校作业创建一个Money课程。我已经定义了从Money到double的转换,我有一个Money的构造函数,它接受一个int,另一个构造函数接受一个double,我重载了“+”运算符,将两个Money类型的对象相加。当我尝试执行myMoney + 10
之类的操作时出现错误消息,其中myMoney是Money类型的对象,而10显然是整数。以下是相关代码的其余部分:
class Money {
private:
int dollars;
int cents;
public:
Money(double r);
Money(int d) : dollars(d), cents(0) {}
operator double();
}
Money operator+(Money a, Money b) {
double r = double(a) + double(b);
return Money(r);
}
Money::operator double() {
return dollars+double(cents)/100;
}
Money::Money(double r) {
...
}
如果我尝试Money(double(myMoney)+10)
并且如果我将两个构造函数都显式化,那么该程序实际上是有效的,但我不确定我是否理解自动转换会发生什么。任何人都可以解释这种行为吗?
答案 0 :(得分:4)
MyMoney + 10
由于没有operator+(Money, int)
,因此必须在此处进行一些转换。编译器可以将Money
转换为double
,然后将10转换为'double'并选择内置operator+(double,double)
,或者它可以将int
转换为Money
并选择operator+(Money,Money)
。
答案 1 :(得分:0)
编译器和Benjamin指出的问题是,有两个转换序列导致operator+
重载的不同有效参数集。但这实际上表明设计存在更深层次的问题。应该几乎不使用隐式转换,并且从两种不同类型进行隐式转换是问题的处方。
考虑使构造函数显式化,并使转换运算符也显式(C ++ 11语言特性),或者删除它们并提供命名转换(通过成员函数而不是运算符),如{{1}中的情况}。
将任何东西自动转化为金钱真的有意义吗?那就像变成灰尘一样容易吗?学习让编译器通过避免削弱类型系统的隐式转换来帮助您检测逻辑问题。