m0_74075767 2023-02-10 16:59 采纳率: 100%
浏览 39
已结题

转换构造函数造成的二义性问题

问题描述:
自定义Time类,写有double转Time和Time转double的转换构造函数,类内重载加号运算符,本来以为写Time1=double1+Time2会引发二义性,
既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则),也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2,但是最后正常运行,想问一下我在哪里理解错误。

#include <iostream>
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;
}

  • 写回答

1条回答 默认 最新

  • GISer Liu 2023-02-10 17:06
    关注

    以下答案引用自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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月10日

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)