关于运算符重载的问题

bluegirl2003 2003-08-25 10:16:29
为了清楚说明我的问题,先把程序贴出来
#include <iostream.h>

class RMB
{
public:
RMB(unsigned int d,unsigned int c);
RMB(double d);
friend RMB operator +(RMB&,RMB&);//非成员形式
friend RMB& operator ++(RMB&);//非成员形式
void display()
{
cout<<(yuan + jf/100.0)<<endl;
}
protected:
unsigned int yuan;
unsigned int jf;
};

RMB::RMB(unsigned int d, unsigned int c)
{
yuan =d;
jf=c;
while (jf>=100)
{
yuan++;
jf-=100;
}
}

RMB::RMB(double d)
{
yuan =(int)d;
jf=(int)((d-yuan)*100+0.5);
}

RMB operator+(RMB& s,RMB &t)
{
unsigned int yuan =t.yuan + s.yuan;
unsigned int jf =t.jf+s.jf;
RMB result(yuan,jf);
return result;
}

RMB& operator++(RMB& s)
{
s.jf++;
if(s.jf>=100)
{
s.jf-=100;
s.yuan ++;
}
return s;
}

void main()
{
RMB d1(1,60);
RMB d2(0,0);
d2=RMB(1.58)+d1;//必须显式转换??????
d2.display();
d2=d1+RMB(1.585);//必须显式转换?????
d2.display();
d2=1+2.4;//可以,相当于 d2=RMB(3.5);
d2.display();
}
...全文
62 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2003-08-31
  • 打赏
  • 举报
回复
friend RMB operator +(const RMB&,const RMB&);//必须改为const类型!!
这样有必要用 friend 吗?
RMB operator+(const RMB&) const; 不就 可以?
bluegirl2003 2003-08-31
  • 打赏
  • 举报
回复
???
xushengyong 2003-08-27
  • 打赏
  • 举报
回复
up...
csj6214499 2003-08-26
  • 打赏
  • 举报
回复

RMB d1(1,60);
RMB d2(0,0);

d2=1.58 + d1;//隐式转换
d2= RMB(1.58) + d1;//显式转换

d2=d1 +1 .585;//隐式转换
d2=d1 + RMB(1.585);//显式转换

d2=1 + 2.4;//可以,相当于 d2=RMB(3.5);
是很好解决的
sevecol 2003-08-26
  • 打赏
  • 举报
回复
两种转化的const特性不一样,我想
xushengyong 2003-08-26
  • 打赏
  • 举报
回复
对啊,我也不知道,请高手们快点...江湖告急...
bluegirl2003 2003-08-26
  • 打赏
  • 举报
回复
我现在已经知道了怎么样把我的程序改对,结果已经在前面贴出来了。

我现在不明白的是为什么要加上const
bluegirl2003 2003-08-26
  • 打赏
  • 举报
回复
to csj6214499(程胜军):和我的一样,什么意思?


sevecol 2003-08-25
  • 打赏
  • 举报
回复
前面两个也不需要显式转化。
bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
刚才发错了:
改后的:
#include <iostream.h>

class RMB
{
public:
RMB(unsigned int d,unsigned int c);
RMB(double d);
friend RMB operator +(const RMB&,const RMB&);//必须改为const类型!!
friend RMB& operator ++(RMB&);//
void display()
{
cout<<(yuan + jf/100.0)<<endl;
}
protected:
unsigned int yuan;
unsigned int jf;
};

RMB::RMB(unsigned int d, unsigned int c)
{...}

RMB::RMB(double d)
{
...
}

RMB operator+(const RMB& s,const RMB &t)
{
...
}

RMB& operator++(RMB& s)
{
...
}

void main()
{
RMB d1(1,60);
RMB d2(0,0);

d2=1.58 + d1;//隐式转换
d2= RMB(1.58) + d1;//显式转换

d2=d1 +1 .585;//隐式转换
d2=d1 + RMB(1.585);//显式转换

d2=1 + 2.4;//可以,相当于 d2=RMB(3.5);
}

bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
修改后的程序:
#include <iostream.h>

class RMB
{
public:
RMB(unsigned int d,unsigned int c);
RMB(double d);
friend RMB operator +(const RMB&,const RMB&);//必须改为const类型!!
friend RMB& operator ++(RMB&);//
void display()
{
cout<<(yuan + jf/100.0)<<endl;
}
protected:
unsigned int yuan;
unsigned int jf;
};

RMB::RMB(unsigned int d, unsigned int c)
{...}

RMB::RMB(double d)
{
...
}

RMB operator+(RMB& s,RMB &t)
{
unsigned int yuan =t.yuan + s.yuan;
unsigned int jf =t.jf+s.jf;
RMB result(yuan,jf);
return result;
}

RMB& operator++(RMB& s)
{
s.jf++;
if(s.jf>=100)
{
s.jf-=100;
s.yuan ++;
}
return s;
}

void main()
{
RMB d1(1,60);
RMB d2(0,0);
d2=RMB(1.58)+d1;//必须显式转换??????
d2.display();
d2=d1+RMB(1.585);//必须显式转换?????
d2.display();
d2=1+2.4;//可以,相当于 d2=RMB(3.5);
d2.display();
}
sevecol 2003-08-25
  • 打赏
  • 举报
回复
to bluegirl2003(小笨笨猫):

我也只是这样认为的,还没找到相关的文档。

const RMB& t1=1.26;//去掉const不能编译通过
RMB& t1=(RMB)1.26;//
bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
to sevecol(看什么看...) :嗯,我把参数进行了修改:
RMB operator+(const RMB&,const RMB &t);
就可以通过编译,而且运行结果完全正确。

多谢了 ^_^

不过你能否再告诉我如何分析得知1.54经过类型转换之后得到的是一个const RMB对象?我对这个理解得不够深入
sevecol 2003-08-25
  • 打赏
  • 举报
回复
第二个表达式

原来代码第二个参数是非const的,而通过隐式转换得到的是const,我们知道不能由const自然的的转换成非const,所以失败。

你用的是什么编译器?
bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
to sevecol(看什么看...) :分析得有点道理,但是如果按照你所说得进行修改,又怎么体现C++的优越性?

如果把参数都改为const RMB&,是不是就可以了?

wbh0360 2003-08-25
  • 打赏
  • 举报
回复
因为你重载的只是class RMB之间的“+”,与其他类型加必须先转换,而你
是自定义类型,编译不会帮你做隐式转换,你只能显式转换。
象int等为内置,编译器回自动做隐式转换。
bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
书上说可以隐式转换的原因是:
对于d2=d1+1.5;这样的语句,由于其中的一个操作数是RMB对象,而且参数个数相同,所以它首先假定operator +(RMB&,RMB&)可以匹配,然后寻找能够使用的转换。发现构造函数RMB(double)可以作为转换的依据。在完成转换之后,真正匹配operator +(RMB&,RMB&)运算符。

对于s=1.5+2.4;这样的语句,由于左右操作数都是都是double类型,匹配基本数据类型的加法,故先进行浮点运算。然后因为赋值表达式左边是RMB对象,所以该赋值运算将右边表达式的结果用构造函数RMB(double)进行RMB转换,再赋值给s。


我认为这样讲得很有道理,但就是不明白为什么程序在具体的编译环境中不能通过编译
sevecol 2003-08-25
  • 打赏
  • 举报
回复
d2= 1.54 + d1;
d2= d1 + 1.54;
d2= 1.54 + 2.3;

第一个表达式里面1.54生成的RMB对象是const,你原来的+函数的两个参数的第一个参数是非const德,所以编译器不会做这样的转换,所以不能通过
使用显式转换得到的是非const对象,所以可以通过。
bluegirl2003 2003-08-25
  • 打赏
  • 举报
回复
to sevecol(看什么看...) :由这个必要吗?请说明原因

newxixi 2003-08-25
  • 打赏
  • 举报
回复
我也不知道,帮你顶一下
加载更多回复(4)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧