博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++实践参考——复数类中的运算符重载
阅读量:7091 次
发布时间:2019-06-28

本文共 7791 字,大约阅读时间需要 25 分钟。

返回:

【项目-实现复数类中的运算符重载】
(1)请用类的成员函数,定义复数类重载运算符+、-、*、/,使之能用于复数的加减乘除
class Complex {public:    Complex(){real=0;imag=0;}    Complex(double r,double i){real=r; imag=i;}    Complex operator+(const Complex &c2);    Complex operator-(const Complex &c2);    Complex operator*(const Complex &c2);    Complex operator/(const Complex &c2);    void display();private:    double real;    double imag;};//下面定义成员函数//下面定义用于测试的main()函数int main(){    Complex c1(3,4),c2(5,-10),c3;    cout<<"c1=";    c1.display();    cout<<"c2=";    c2.display();    c3=c1+c2;    cout<<"c1+c2=";    c3.display();    c3=c1-c2;    cout<<"c1-c2=";    c3.display();    c3=c1*c2;    cout<<"c1*c2=";    c3.display();    c3=c1/c2;    cout<<"c1/c2=";    c3.display();    return 0;}
[参考解答]
#include 
using namespace std;class Complex{public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(const Complex &c2); Complex operator-(const Complex &c2); Complex operator*(const Complex &c2); Complex operator/(const Complex &c2); void display();private: double real; double imag;};//下面定义成员函数//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.Complex Complex::operator+(const Complex &c2){ Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c;}//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.Complex Complex::operator-(const Complex &c2){ Complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return c;}//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.Complex Complex::operator*(const Complex &c2){ Complex c; c.real=real*c2.real-imag*c2.imag; c.imag=imag*c2.real+real*c2.imag; return c;}//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)iComplex Complex::operator/(const Complex &c2){ Complex c; c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return c;}void Complex::display(){ cout<<"("<
<<","<
<<"i)"<
(2)请用类的友元函数,而不是成员函数,再次完成上面提及的运算符的重载;
[参考解答]
#include 
using namespace std;class Complex{public: Complex() { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } friend Complex operator+(Complex &c1, Complex &c2); friend Complex operator-(Complex &c1, Complex &c2); friend Complex operator*(Complex &c1, Complex &c2); friend Complex operator/(Complex &c1, Complex &c2); void display();private: double real; double imag;};//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i.Complex operator+(Complex &c1, Complex &c2){ Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c;}//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.Complex operator-(Complex &c1, Complex &c2){ Complex c; c.real=c1.real-c2.real; c.imag=c1.imag-c2.imag; return c;}//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.Complex operator*(Complex &c1, Complex &c2){ Complex c; c.real=c1.real*c2.real-c1.imag*c2.imag; c.imag=c1.imag*c2.real+c1.real*c2.imag; return c;}//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)iComplex operator/(Complex &c1, Complex &c2){ Complex c; c.real=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); c.imag=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return c;}void Complex::display(){ cout<<"("<
<<","<
<<"i)"<

  事实上,运算符重载的函数还可以定义成一般函数,只不过这种做法并不好。下面给出使用一般函数完成运算符重载的程序。其中,加了序号的几处注释值得关注。

#include 
using namespace std;class Complex{public: Complex() { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } double getReal() const { return real; //(1)定义公用的数据接口,可以为const成员函数 } double getImag() const { return imag; } void setReal(double r) { real=r; //(1)定义公用的数据接口 } void setImag(double i) { imag=i; } void display();private: double real; double imag;};//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i.Complex operator+(const Complex &c1, const Complex &c2) //(3)将参数处理为const更符合需求{ Complex c; c.setReal(c1.getReal()+c2.getReal()); //(2)调用公用数据接口读取和修改私有数据成员 c.setImag(c1.getImag()+c2.getImag()); return c;}//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.Complex operator-(const Complex &c1, const Complex &c2){ Complex c; c.setReal(c1.getReal()-c2.getReal()); c.setImag(c1.getImag()-c2.getImag()); return c;}//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.Complex operator*(const Complex &c1, const Complex &c2){ Complex c; c.setReal(c1.getReal()*c2.getReal()-c1.getImag()*c2.getImag()); c.setImag(c1.getImag()*c2.getReal()+c1.getReal()*c2.getImag()); return c;}//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)iComplex operator/(const Complex &c1, const Complex &c2){ Complex c; double d= (c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag()); c.setReal((c1.getReal()*c2.getReal()+c1.getImag()*c2.getImag())/d); c.setImag((c1.getImag()*c2.getReal()-c1.getReal()*c2.getImag())/d); return c;}void Complex::display(){ cout<<"("<
<<","<
<<"i)"<
(3)定义一个定义完整的类(是可以当作独立的产品发布,成为众多项目中的“基础工程”)。这样的类在(2)的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c+d和d+c的结果为“将d视为实部为d的复数同c相加”,其他-、*、/运算符类似。
[参考解答]
#include 
using namespace std;class Complex{public: Complex() { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } friend Complex operator+(Complex &c1, Complex &c2); friend Complex operator+(double d1, Complex &c2); friend Complex operator+(Complex &c1, double d2); friend Complex operator-(Complex &c1, Complex &c2); friend Complex operator-(double d1, Complex &c2); friend Complex operator-(Complex &c1, double d2); friend Complex operator*(Complex &c1, Complex &c2); friend Complex operator*(double d1, Complex &c2); friend Complex operator*(Complex &c1, double d2); friend Complex operator/(Complex &c1, Complex &c2); friend Complex operator/(double d1, Complex &c2); friend Complex operator/(Complex &c1, double d2); void display();private: double real; double imag;};//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i.Complex operator+(Complex &c1, Complex &c2){ Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c;}Complex operator+(double d1, Complex &c2){ Complex c(d1,0); return c+c2; //按运算法则计算的确可以,但充分利用已经定义好的代码,既省人力,也避免引入新的错误,但可能机器的效率会不佳}Complex operator+(Complex &c1, double d2){ Complex c(d2,0); return c1+c;}//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.Complex operator-(Complex &c1, Complex &c2){ Complex c; c.real=c1.real-c2.real; c.imag=c1.imag-c2.imag; return c;}Complex operator-(double d1, Complex &c2){ Complex c(d1,0); return c-c2;}Complex operator-(Complex &c1, double d2){ Complex c(d2,0); return c1-c;}//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.Complex operator*(Complex &c1, Complex &c2){ Complex c; c.real=c1.real*c2.real-c1.imag*c2.imag; c.imag=c1.imag*c2.real+c1.real*c2.imag; return c;}Complex operator*(double d1, Complex &c2){ Complex c(d1,0); return c*c2;}Complex operator*(Complex &c1, double d2){ Complex c(d2,0); return c1*c;}//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)iComplex operator/(Complex &c1, Complex &c2){ Complex c; c.real=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); c.imag=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return c;}Complex operator/(double d1, Complex &c2){ Complex c(d1,0); return c/c2;}Complex operator/(Complex &c1, double d2){ Complex c(d2,0); return c1/c;}void Complex::display(){ cout<<"("<
<<","<
<<"i)"<

转载地址:http://mnsql.baihongyu.com/

你可能感兴趣的文章
MySQL必须调整的10项配置优化
查看>>
【译】编写更好的CSS必备的40个工具
查看>>
Retrofit--合理封装回调能让你的项目高逼格
查看>>
Visual D 0.49.0 发布,支持 Visual Studio 2019
查看>>
[原创]同一个Tomcat,配置多个context、多个Host
查看>>
OSDI '18重磅解密:蚂蚁金服实时金融级分布式图数据库GeaBase
查看>>
Spring(十四)之编程性事务(续)
查看>>
读《股票大作手操盘术》— 利弗莫尔操作法则
查看>>
基于Opencv&Tensorflow实现实时查找停车位置
查看>>
Red Hat Enterprise Linux(RHEL)中yum的repo文件详解
查看>>
CSS3 是最新的 CSS 标准
查看>>
通过git工具提交文件到GitHub
查看>>
Confluence 6 管理协同编辑 - 代理和 SSL 的考虑
查看>>
Confluence 6 从一个 XML 备份中导入一个空间
查看>>
彩铅练习,樱桃
查看>>
yum 找不到程序, yum更换国内阿里源
查看>>
快速排序
查看>>
tomcat 、springboot远程调试
查看>>
1-AI--Activity生命周期
查看>>
SpringBoot集成RabbitMQ
查看>>