第九周项目1:复数类中的运算符重载(续)
2015-05-13 08:38
387 查看
问题及代码:
运行结果:
![](http://img.blog.csdn.net/20150513083616825?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGVzdGlueV9Gb3JldmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
知识点总结:
复数类中的运算符重载。以及输入输出流的运算符重载
学习心得:
1.单目运算符的重载设置为成员函数
2.输入输出流的运算符重载不能设置为成员函数,因为作为成员函数进行的运算符重载的第一个参数应该是当前类的对象,即*this指针。
3.定义好的重载运算符,在与其相关的运算符重载中,应该学会积极调用。
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年5月13日 *版 本 号:v1.0 * *问题描述:(1)再定义一目运算符 -,-c相当于0-c。 (2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。 *程序输入: *程序输出: */ #include <iostream> using namespace std; class Complex { public: Complex() { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } //定义一目运算符 -,取反运算符 Complex operator-(); //定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式 friend ostream& operator << (ostream& cout, const Complex& c); friend istream& operator >> (istream& cin, Complex& c); //运算符重载函数的声明要考虑全面 friend Complex operator+(const Complex &c1,const Complex &c2); friend Complex operator+(const Complex &c1,double d2); friend Complex operator+(double d1,const Complex &c2); friend Complex operator-(const Complex &c1,const Complex &c2); friend Complex operator-(const Complex &c1,double d2); friend Complex operator-(double d1,const Complex &c2); friend Complex operator*(const Complex &c1,const Complex &c2); friend Complex operator*(const Complex &c1,double d2); friend Complex operator*(double d1,const Complex &c2); friend Complex operator/(const Complex &c1,const Complex &c2); friend Complex operator/(const Complex &c1,double d2); friend Complex operator/(double d1,const Complex &c2); private: double real; double imag; }; //定义一目运算符 -,取反运算符 Complex Complex::operator-() { return (0-*this); //直接调用重载的剑法运算符取反 } //输出运算符的重载 ostream& operator << (ostream& cout, const Complex& c) { cout<<c.real; if(c.imag>=0) cout<<"+"; cout<<c.imag<<"i"<<endl; return cout; } //输入运算符的重载 istream& operator >> (istream& cin, Complex& c) { int a,b; char ch,i; do { cin>>a>>ch>>b>>i; } while(!((ch=='+'||ch=='-')&&i=='i')); //格式正确,则跳出循环 c.real=a; c.imag=(ch=='+')?b:-b; //为虚部赋正确的值 return cin; } //下面为友元函数 Complex operator+(const Complex &c1,const Complex &c2) { Complex c(c1.real+c2.real,c1.imag+c2.imag); return c; } Complex operator+(const Complex &c1,double d2) { Complex c(c1.real+d2,c1.imag); return c; } //如上个运算符重载函数,可以实部相加,虚数相加,也可以像这个重载函数,充分利用以前定义的函数,达到简化目的 //或许加法运算看不清楚这样做的方便性,但是在乘除法运算中,便可以充分体会到这样做的好处 Complex operator+(double d1,const Complex &c2) { Complex c(d1,0); return c+c2; } Complex operator-(const Complex &c1,const Complex &c2) { Complex c(c1.real-c2.real,c1.imag-c2.imag); return c; } Complex operator-(const Complex &c1,double d2) { Complex c(d2,0); return c1-c; } Complex operator-(double d1,const Complex &c2) { Complex c(d1,0); return c-c2; } //复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i. Complex operator*(const Complex &c1,const 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*(const Complex &c1,double d2) { Complex c(d2,0); return c*c1; } Complex operator*(double d1,const Complex &c2) { Complex c(d1,0); return c*c2; } //复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i Complex operator/(const Complex &c1,const 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/(const Complex &c1,double d2) { Complex c(d2,0); return c1/c; } Complex operator/(double d1,const Complex &c2) { Complex c(d1,0); return c/c2; } //下面定义用于测试的main()函数,一定要全面 int main() { Complex c1(1,2),c2(3,-1),c3; cout<<"c1="<<c1; cout<<"c2="<<c2; cout<<"请按正确格式(a+bi或a-bi)输入一个复数:"; cin>>c3; cout<<"c1+c2="<<c1+c2; cout<<"c1+5="<<c1+5; cout<<"1+c2="<<1+c2; cout<<"c1-c2="<<c1-c2; cout<<"c1-3="<<c1-3; cout<<"3-c1="<<3-c1; cout<<"c1*c2="<<c1*c2; cout<<"0*c1="<<0-c1; cout<<"c1*1="<<c1*1; cout<<"c1/c2="<<c1/c2; cout<<"c1/1="<<c1/1; cout<<"0/c2="<<0/c2; cout<<"c3的相反数为:"<<-c3; return 0; }
运行结果:
知识点总结:
复数类中的运算符重载。以及输入输出流的运算符重载
学习心得:
1.单目运算符的重载设置为成员函数
2.输入输出流的运算符重载不能设置为成员函数,因为作为成员函数进行的运算符重载的第一个参数应该是当前类的对象,即*this指针。
3.定义好的重载运算符,在与其相关的运算符重载中,应该学会积极调用。
相关文章推荐
- 第九周(项目一)——实现复数类中的运算符重载。
- 第九周 项目一:复数类中的运算符重载(续)
- 第九周项目一:复数类中的运算符重载(续)
- 第九周上机实践项目——更自然实现复数类中的运算符重载
- 2014年第九周项目一:复数类中的运算符重载(续)
- 2015年第九周项目一:复数类中的运算符重载(续)(2)
- 第12周项目1:实现复数类中的运算符重载(1)
- 第十二周项目2:实现复数类中的运算符重载(1)
- 第八周 项目一:实现复数类中的运算符重载
- 第八周上机实践项目1——实现复数类中的运算符重载(1)
- 第12周项目1—实现复数类中的运算符重载 (2)
- 第八周项目一任务三——实现复数类中的运算符重载
- 第12周项目-1实现复数类中的运算符重载 (3)
- 第八周 项目一(2):实现复数类中的运算符重载(友元函数)
- 第十二周实践项目1————实现复数类中的运算符重载之友元函数
- 第12周项目——实现复数类中的运算符重载3
- 15第八周项目一——实现复数类中的运算符重载(成员函数)
- 第八周项目一任务二——实现复数类中的运算符重载(利用类的友元函数)
- 第八周上机项目1.2复数类中的运算符重载
- 第八周 项目1.3 定义不同的友元函数实现数学上的交换律 从而实现复数类中的运算符重载