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 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程