我正在为一项学校作业创建一个金钱类。我定义了一个从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)
,并且我显式地将两个构造函数都设置为显式,那么程序实际上是有效的,但是我不确定我是否理解了自动转换发生了什么。有人能解释这种行为吗?
发布于 2012-04-27 08:31:16
MyMoney + 10
因为没有operator+(Money, int)
,所以必须在这里进行一些转换。编译器可以将Money
转换为double
,然后将10转换为“double”并选择内置的operator+(double,double)
,也可以将int
转换为Money
并选择您的operator+(Money,Money)
。
发布于 2012-04-27 09:26:43
正如编译器所看到的,正如本杰明所指出的,问题是有两个转换序列导致operator+
重载的不同有效参数集。但这实际上表明了设计中存在更深层次的问题。隐式转换应该很少使用,并且有两种不同类型的隐式转换会导致问题。
考虑使构造函数显式,或者使转换操作符也显式(C++11语言特性),或者删除它们并提供命名转换(通过成员函数而不是操作符),就像std::string::c_str()
中的情况一样。
任何东西都会自动变成钱,这真的有意义吗?就像它很容易变成灰尘一样?学习让编译器通过避免削弱类型系统的隐式转换来帮助您检测逻辑问题。
https://stackoverflow.com/questions/10343161
复制相似问题