关于运算符重载的问题,求教

DelphiBegin 2003-08-21 12:01:30
构造一个复数类(complex类)。使其能够进行复数的关系运算:= =和 !=;复数的输入和输出运算。创建完这个类之后,请编一个程序进行各项的验证。
请大家帮帮忙 我刚学c++ 对这个不是很清楚 看了论坛上Kusk的文章 C++入门解惑(1)——浅析cout 后 有一点了解 但还不是会做啊 希望各位大虾帮帮我 给个源代码看下 不胜感激!!!!!
...全文
127 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nirvana_li 2003-08-23
  • 打赏
  • 举报
回复
这里有一些运算符重载的实例:

myString + yourString 可以连接两个 std::string 对象
myDate++ 可以增加一个 Date 对象
a * b 可以将两个 Number 对象相乘
a[i] 可以访问 Array 对象的某个元素
x = *p 可以反引用一个实际“指向”一个磁盘记录的 "smart pointer" —— 它实际上在磁盘上定位到 p 所指向的记录并返回给x。
ttlb 2003-08-23
  • 打赏
  • 举报
回复
多谢ppm07(浩浩白水)
fancy123 2003-08-22
  • 打赏
  • 举报
回复
建议参照 Thinking C++.
ppm07 2003-08-22
  • 打赏
  • 举报
回复
to ttlb(小鸟):
我对这几条规则的理解是这样的:
1。“+=”的运算速度要比相应的“+”快(“+”的函数要返回一个副本,而“+=”只返回一个引用),所以为了优化程序,建议使用“+=”;而“+”的可读性强,适宜在不影响整体速度而又要求可读性强的代码中使用。
2。用友员重载算术运算符的原因是防止以下代码出问题(如果把它作为了类成员函数重载):
Complex a(3,4);
Complex b(5,6);
Complex c;
c = a + b; //没问题
c = a + 10; //可能也没问题
c = 10 + a; //肯定有问题
3。很显然,防止不必要的构造和析构函数的调用。
4。也很明显,就不多讲了。

有理解不当的地方,请高人指点。
ppm07 2003-08-22
  • 打赏
  • 举报
回复
to ttlb(小鸟):
bool operator!=(Complex &c1, Complex &c2)
{
return !(c1 == c2);
}
//////////////////////////////////////////////
你这样做得话首先要保证Complex类的==运算符已经得到了重载,否则就会报错的。
qhgary 2003-08-22
  • 打赏
  • 举报
回复
up
ttlb 2003-08-21
  • 打赏
  • 举报
回复
up
ttlb 2003-08-21
  • 打赏
  • 举报
回复
请问Tangyongkang(匆匆):
把你的operator!= 改写如下,可以吗?或者有什么不妥或者不符合规范的地方吗?
bool operator!=(Complex &c1, Complex &c2)
{
return !(c1 == c2);
}
ttlb 2003-08-21
  • 打赏
  • 举报
回复
回复人: Polarislee(北极星) ( ) 信誉:105 2003-08-21 14:19:00 得分:0
对于算术运算符的重载,有以下几点需要注意:
1,重载运算符前先重载对应的复合赋值运算符,比如:重载"+"前,先重载"+=",再用"+="实现"+"
2,用类成员函数重载复合赋值运算符,用友原函数重载算术运算符
3,参数应该以应用传递
4,复合赋值运算符返回对象自身的引用,算术运算符返回新对象
好多书上都这么说,为什么要这样?能解释一下吗?
panther8888 2003-08-21
  • 打赏
  • 举报
回复
来晚了,不知道能不能捡点分,运算符重载我比较喜欢<thinking in c++>中相应的部分,建议好好读一下。
cityvagrant 2003-08-21
  • 打赏
  • 举报
回复
按照我的专家门诊--》我的问题--》问题--》管理--》输入密码给分
DelphiBegin 2003-08-21
  • 打赏
  • 举报
回复
我是刚来这个论坛的 感谢你们解答了我问题 但我不知道怎么给分啊 真的不是不想给 是不知道怎么给, 我很抱歉 ! 请教教我啊! 真的很感谢你们 谢谢!
北极猩猩 2003-08-21
  • 打赏
  • 举报
回复
对于算术运算符的重载,有以下几点需要注意:
1,重载运算符前先重载对应的复合赋值运算符,比如:重载"+"前,先重载"+=",再用"+="实现"+"
2,用类成员函数重载复合赋值运算符,用友原函数重载算术运算符
3,参数应该以应用传递
4,复合赋值运算符返回对象自身的引用,算术运算符返回新对象
Tangyongkang 2003-08-21
  • 打赏
  • 举报
回复
// 下面是一个完整的程序。
// 建议背下来, 但千万别死背
// 运算符重载这一块儿, Thinking in C++ 讲的很清楚。好好看看


// 程序很简单,所以没加注释,抱歉
#include<iostream.h>


class Complex
{
protected :
double x;
double y;
public :
Complex( double re = 0, double im = 0)
{
x = re;
y = im;
}

Complex(Complex&c);

double GetRe() const
{
return x;
}

double GetIm() const
{
return y;
}

Complex& operator=(Complex& c);

Complex& operator+=(Complex& c);

friend Complex operator+(Complex& c1, Complex& c2);
friend ostream& operator<<(ostream &os, Complex &c);
friend bool operator ==(Complex &c1,Complex &c2);
friend bool operator !=(Complex &c1,Complex &c2);
};

Complex::Complex(Complex& c)
{
x = c.x;
y = c.y;
}

Complex& Complex::operator=(Complex &c)
{
x = c.x;
y = c.y;
return *this;
}

Complex& Complex::operator+=(Complex& c)
{
x += c.x;
y += c.y;

return *this;
}

Complex operator+(Complex& c1, Complex& c2)
{
Complex temp(c1);

temp.x += c2.x;
temp.y += c2.y;

return temp;
}

ostream& operator<<(ostream& os, Complex& c)
{
os<<"("<<c.x<<"+"<<c.y<<"i)";

return os;
}

bool operator==(Complex &c1,Complex &c2)
{
if( c2.x == c1.x && c2.y == c1.y)
return true;
else return false;
}

bool operator!=(Complex &c1, Complex &c2)
{
if( c2.x == c1.x && c2.y == c1.y)
return true;
else return false;
}

int main()
{
Complex u(1,2),v(3,4),uu(1,2);

Complex z;

z = u+v;
cout<< " u == v? ::"<<( u== v)<<endl;

cout<<" u == uu ? ::" <<(u == uu) <<endl;

cout<<u<<"+"<<v<<"="<<z<<endl;

return 1;
}


wbh0360 2003-08-21
  • 打赏
  • 举报
回复
运算符重载
关于c++的书上有的是,c++primer

69,371

社区成员

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

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