关于运算符重载

arczee 2005-04-08 10:18:07
本人初学C++ 遇到一个问题,程序如下:
#include "iostream.h"

class A
{
public:
A(){X=Y=0;}
A(int i,int j){X=i;Y=j;}
A(A &p){X=p.X;Y=p.Y;}
friend A& operator=(A &t,A &p);
int getX(){return X;}
int getY(){return Y;}
private:
int X,Y;
};

A& operator =(A &t,A &p)
{
t.X=p.X;
t.Y=p.Y;
cout<<"Assignment oprator called.\n";
}

void main()
{
A a(7,8);
A b;
b=a;
cout<<b.getX()<<","<<b.getY()<<endl;
}

为什么会出错呢?请各位大虾帮帮偶
...全文
155 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗卜基斯 2005-04-09
  • 打赏
  • 举报
回复
021850524(吸血鬼牌卫生巾) :那个A& A::operator =要返回一个值啊。
ljq14 2005-04-09
  • 打赏
  • 举报
回复
哦我也知道了,谢谢你们啦~~~~~~~~~~
没事~~大家都是互相学习是吧
谢谢大家~~~~~~~
antter 2005-04-09
  • 打赏
  • 举报
回复
关于运算符重载可参考Thinking in C++, 2nd ed. Volume 1,12: Operator Overloading
lsxhc 2005-04-08
  • 打赏
  • 举报
回复
是关于=不能作为友元函数重载的叙述。
lsxhc 2005-04-08
  • 打赏
  • 举报
回复
antter(jiangmiao):
你这个程序就是把=操作符的重载变成了类的成员函数了,我在我的书上没有看到,你能说一下在那本书上有叙述吗?谢谢!
antter 2005-04-08
  • 打赏
  • 举报
回复
ljq14(冷爱) ,我没恶意。但如果伤害到你了,我道歉。

#include "iostream.h"

class A
{
public:
A(){X=Y=0;}
A(int i,int j){X=i;Y=j;}
A(const A &p){X=p.X;Y=p.Y;}
A& operator=(const A& b)
{
X=b.Y;
Y=b.X;
return *this;
}
A& operator=(int a)
{
X=a;
return *this;
}
int getX(){return X;}
int getY(){return Y;}
void show()
{
cout<<X<<","<<Y<<endl;
}
private:
int X,Y;
};

void main()
{
A a(7,8);
A b(a); //调用拷贝构造函数
b.show(); // 输出 7,8
b=a; //调用运算符=
b.show(); // 输出 8,7
b=3; //调用运算符=
b.show(); // 输出 3,7
}
lsxhc 2005-04-08
  • 打赏
  • 举报
回复
在c++中通常都是有缺省的赋值运算符的,如果类中没有指针类型的话缺省赋值运算符就能够胜任工作的,如果有指针类型则要自己声明定义。
楼主的运算符重载格式没有错,友元函数也是这样声明的,但我确实没有见过将赋值运算给重载成友元的,
本人也是接触c++不久。
ljq14 2005-04-08
  • 打赏
  • 举报
回复
这大哥怎么说话呢?
我的确不是什么高手,但是我也想帮楼主一下,我不是说我去查吗?
=不能作为友元重载?我看根本就不用重载,我运行不重载=的函数一样赋值的.
如上,大家在一起是交流的,不是吵架的,望楼上大哥自重.不要看不起别人.谢谢.
你说的是对的,我查到了,但是不重载又为什么可以赋值呢?请教你.
交个朋友,不打不相识.
ljq14 2005-04-08
  • 打赏
  • 举报
回复
#include<iostream.h>
class A{
public:
int X,Y;
A(int xx,int yy):X(xx),Y(yy){}
A(){X=0;Y=0;}
void show(){cout<<"X="<<X<<" Y="<<Y<<endl;}
};


void main()
{ A a1(5,55),a2;
a2=a1; //=运算符不用重载,可直接赋值
a2.show();
}
// 重载+ - 看楼上大哥的程序 就不多说了

~~~~重要的一点是注意私有成员是不能随意访问的!~~~~
antter 2005-04-08
  • 打赏
  • 举报
回复
我知道“ljq14(冷爱)”是来活跃气氛的。

"="只能做为成员函数重载,你用友元函数重载自然有错。
为什么不能直接调用私有成员?破坏了数据分装性?我用友元的目的就是来破坏封装的,嘎嘎。
楼主的友元函数用法并没有错,只是重载的运算符不合法。
visual4825 2005-04-08
  • 打赏
  • 举报
回复
A& A::operator= (const A& p)
{
if (*this == p)
return *this;
X = p.X;
Y = p.Y;
return *this;
}
ljq14 2005-04-08
  • 打赏
  • 举报
回复
你的友元函数有些问题的,如上那样,但是注意私有成员不能直接调用,就OK了~~~~~~
antter 2005-04-08
  • 打赏
  • 举报
回复
你友元函数的用法并没错
#include "iostream.h"

class A
{
public:
A(){X=Y=0;}
A(int i,int j){X=i;Y=j;}
A(const A &p){X=p.X;Y=p.Y;}
friend A& operator+(A &t,A &p);
int getX(){return X;}
int getY(){return Y;}
private:
int X,Y;
};

A& operator +(A &t,A &p)
{
t.X+=p.X;
t.Y+=p.Y;
cout<<"Assignment oprator called.\n";
return t;
}

void main()
{
A a(7,8);
A b(3,4);
b=a+b;
cout<<b.getX()<<","<<b.getY()<<endl;
}
ljq14 2005-04-08
  • 打赏
  • 举报
回复
函数这样写 friend A operator=(const A&p,const A&t){ return A(p.X+t.X,p.Y+t.Y); }
antter 2005-04-08
  • 打赏
  • 举报
回复
#include "iostream.h"

class A
{
public:
A(){X=Y=0;}
A(int i,int j){X=i;Y=j;}
A(const A &p){X=p.X;Y=p.Y;}
int getX(){return X;}
int getY(){return Y;}
private:
int X,Y;
};
void main()
{
A a(7,8);
A b;
b=a;
cout<<b.getX()<<","<<b.getY()<<endl;
}
你用的不是用拷布构造函数吗?
ljq14 2005-04-08
  • 打赏
  • 举报
回复
X Y 是私有成员,不能这样调用t.X=p.X;t.Y=p.Y;要用get()函数调用,友元的格式好象也有些问题,正帮你看看呢,等下~~~~

021850524 2005-04-08
  • 打赏
  • 举报
回复
class A
{
public:
A(){X=Y=0;}
A(int i,int j){X=i;Y=j;}
A(A &p){X=p.X;Y=p.Y;}
friend A& operator=(const A &p);
int getX(){return X;}
int getY(){return Y;}
private:
int X,Y;
};

A& A::operator =(const A &p)
{
X=p.X;
Y=p.Y;
cout<<"Assignment oprator called.\n";
}

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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