| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1400 人关注过本帖
标题:[求助]vc++关于操作符重载的问题。
只看楼主 加入收藏
xieyou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-11-29
收藏
 问题点数:0 回复次数:4 
[求助]vc++关于操作符重载的问题。

正确的程序如下:
#include<iostream.h>//a
class RMB
{
int yuan,jiao;
public:
RMB(int y=0,int j=0)
{
yuan=y;
jiao=j;
}
void display()
{
cout<<yuan<<"元"<<jiao<<"角\n";
}
friend RMB operator+(const RMB& a,const RMB& b);
};
RMB operator+(const RMB& a,const RMB& b)
{
RMB temp;
temp.yuan=a.yuan+b.yuan;
temp.jiao=a.jiao+b.jiao;
if(temp.jiao>=10)
{
temp.yuan++;
temp.jiao-=10;
}
return temp;
}
void main()
{
RMB s(7,6),t(8,7);
RMB m;
m=s+t;
m.display();
}
将程序作如下修改,就会出现我不能理解的错误:
1:将a处的语句改成:
#include<iostream>
using namespace std;
错误好下:
E:\vc++\SOFTWA~2\VC60\MyProjects\xieyou\01.cpp(16) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1786)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
2:将友元函数RMB operator+(const RMB& a,const RMB& b)变为RMB类的成员函数,程序如下:
#include<iostream.h>
class RMB
{
int yuan,jiao;
public:
RMB(int y=0,int j=0)
{
yuan=y;
jiao=j;
}
void display()
{
cout<<yuan<<"元"<<jiao<<"角\n";
}
RMB operator+(RMB& a,RMB& b)
{
RMB temp;
temp.yuan=a.yuan+b.yuan;
temp.jiao=a.jiao+b.jiao;
if(temp.jiao>=10)
{
temp.yuan++;
temp.jiao-=10;
}
return temp;
}
};
void main()
{
RMB s(7,6),t(8,7);
RMB m;
m=s+t;
m.display();
}
错误如下:
e:\vc++\softwa~2\vc60\myprojects\xieyou\01.cpp(16) : error C2804: binary 'operator +' has too many parameters
e:\vc++\softwa~2\vc60\myprojects\xieyou\01.cpp(16) : error C2333: '+' : error in function declaration; skipping function body
e:\vc++\softwa~2\vc60\myprojects\xieyou\01.cpp(33) : error C2676: binary '+' : 'class RMB' does not define this operator or a conversion to a type acceptable to the predefined operator
而这时再在operator+(const RMB& a,const RMB& b)加上friend又没有错了:这函数明明是RMB类的成员函数为什么还要声明为RMB类的友元函数。
另外:程序作如下变换也正确:
#include<iostream.h>
class RMB
{
int yuan,jiao;
public:
RMB(int y=0,int j=0)
{
yuan=y;
jiao=j;
}
void display()
{
cout<<yuan<<"元"<<jiao<<"角\n";
}
RMB operator+(RMB& b)
{
RMB temp;
temp.yuan=yuan+b.yuan;
temp.jiao=jiao+b.jiao;
if(temp.jiao>=10)
{
temp.yuan++;
temp.jiao-=10;
}
return temp;
}
};
void main()
{
RMB s(7,6),t(8,7);
RMB m;
m=s+t;
m.display();
}
本人初学VC++,如有语言叙述错误还望见谅。
希望大家帮我解释一下,在此先谢过了。

搜索更多相关主题的帖子: 操作符 jiao yuan RMB temp 
2006-11-29 16:25
luoxian_2003
Rank: 1
等 级:新手上路
威 望:2
帖 子:163
专家分:0
注 册:2006-2-22
收藏
得分:0 
当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。
原因是当重载为类的成员函数时,如果某个对象使用了重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是本身 。
而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,(友元函数不是类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员)因此使用到的参数都要进行传递,操作数的个数就不会有变化了。不知道说清楚了没
LZ可以看看书,上面都讲到了

天地有正气,凛烈万古存。
2006-11-29 21:53
xieyou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-11-29
收藏
得分:0 

是不是可以在类里面定义友元函数呢(即在类的结构体里面写出友元函数的函数体)?

2006-11-30 13:03
luoxian_2003
Rank: 1
等 级:新手上路
威 望:2
帖 子:163
专家分:0
注 册:2006-2-22
收藏
得分:0 

可以阿,像这类的问题最好自己试试就行了,还能加深印象,对吧。


天地有正气,凛烈万古存。
2006-11-30 19:55
xieyou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-11-29
收藏
得分:0 
谢谢了
2006-11-30 20:01
快速回复:[求助]vc++关于操作符重载的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021227 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved