问题描述:
自定义Time类,写有double转Time和Time转double的转换构造函数,类内重载加号运算符,本来以为写Time1=double1+Time2会引发二义性,
既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则),也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2,但是最后正常运行,想问一下我在哪里理解错误。
#include
using namespace std;
struct Time
{
public:
Time operator+(const Time& t1)
{
return Time(hour + t1.hour, minute + t1.minute, second + t1.second);
}
Time(int h,int m,int s):hour(h),minute(m),second(s){}
Time(double d)
{
hour = d;
}
operator double()
{
return hour;
}
private:
int hour;
int minute;
int second;
};
int main()
{
Time t1(10,10,10);
Time t2(t1);
double d1 = 10, d2 = 5;
t2 = d1+t2;//既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则)
//也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2;
return 0;
}
以下答案引用自GPT-3大模型,请合理使用:
答:
自定义Time类,写有double转Time和Time转double的转换构造函数,类内重载加号运算符。本来以为写Time1=double1+Time2会引发二义性,既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则),也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2,但是最后正常运行。
错在哪里呢?
在C++中,类重载的运算符优先级高于类内的运算符。即当在类中定义了一个重载的运算符时,编译器会自动推导出其他的运算符。在上例中,t2=d1+t2; 其实就是t2=d1+Time(t2);,由于类内已经定义了运算符+,因此会自动调用类内的+。这里需要特别注意的是,类重载的运算符必须要求参数的类型相同。因此在上面的例子中,t1和t2的类型必须相同,即 both of t1 and t2 must be of type Time.