3

我正在为学校作业创建一个 Money 课程。我已经定义了从 Money 到 double 的转换,我有一个 Money 的构造函数,它接受一个 int,另一个构造函数接受一个 double,并且我重载了“+”运算符以将两个 Money 类型的对象相加。当我尝试执行类似myMoney + 10myMoney 是 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)并且如果我明确两个构造函数,该程序实际上可以工作,但我不确定我是否理解自动转换发生了什么。谁能解释这种行为?

4

2 回答 2

4
MyMoney + 10

由于没有operator+(Money, int),因此必须在此处进行一些转换。编译器可以将 转换Money为 a double,然后将 10 转换为 'double' 并选择内置的operator+(double,double),或者它可以转换intMoney并选择您的operator+(Money,Money).

于 2012-04-27T00:31:16.153 回答
0

编译器看到的问题以及 Benjamin 指出的问题是,有两个转换序列会导致operator+重载的不同有效参数集。但这实际上表明设计存在更深层次的问题。几乎不应该使用隐式转换,并且从两种不同类型进行隐式转换是一个问题的根源。

考虑使您的构造函数显式化,或者使转换运算符也显式化(C++11 语言特性),或者删除它们并提供命名转换(通过成员函数而不是运算符),就像std::string::c_str().

任何东西都会自动变成钱真的有意义吗?它也很容易变成灰尘吗?学习让编译器通过避免削弱类型系统的隐式转换来帮助您检测逻辑问题。

于 2012-04-27T01:26:42.773 回答