当前位置: 首页 > article >正文

【c/c++】复数类

1.使用成员函数实现运算符的重载

#include<iostream>
using namespace std;
/*
1.同一个运算符可以代表多个不同的功能,编译系统是根据操作的数据来判别该执行具体哪一个功能的
*/class complex
{
public:complex(){ real = 0; imag = 0; } //有参和无参的构造函数complex(double r, double i){ real = r; imag = i; }//当运算符重载为类的成员函数时的时候,函数的参数的个数要比原来的操作数少一个(后置“++”、“-”除外),因为成员函数都是通过该类的某个对象来访问的,成员函数中有一隐含的参数this指针,this指针//指向当前的对象,而当前的对象本身就是其中的一个操作数。//当运算符重载为友元函数的时候,参数的个数与原来的操作数目是一样的complex operator+(complex &c2);//运算符的重载。因为本身的‘+’只能是对基本类型数据进行操作,现在想要对复数类也进行操作。那么必须要重载,重新定义其为我们需要的功能complex operator-(complex &c2);complex operator*(complex &c2);complex operator/(complex &c2);complex operator+(int &i);complex operator-(int &i);complex operator*(int &i);complex operator/(int &i);void display();
private:double real;double imag;
};
//不明白为什么这里的return不能像后面复数与整数相加时的return.
//解答:还不都是一样的,只不过是因为前面涉及到了实部和虚部操作,因此重新构造一个复数类的对象会使程序更加明了。
//后面只是用到了实部,因此不需要浪费内存空间,重新申请一个新的复数类的对象(乘除除外)。程序简化为直接创建一个临时的无名对象作为返回值,程序的运行效率更高//复数和复数的操作运算
complex complex::operator+(complex &c2)
{complex c;c.real = real + c2.real;c.imag = imag + c2.imag;return c;
}
complex complex::operator-(complex &c2)
{complex c;c.real = real - c2.real;c.imag = imag - c2.imag;return c;
}
complex complex::operator *(complex &c2)
{complex c;c.real = real*c2.real - imag*c2.imag;c.imag = imag*c2.real + real*c2.imag;return c;
}
complex complex::operator / (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;
}//复数与整数之间的操作
complex complex::operator +(int &i)
{return complex(real + i, imag);
}
complex complex::operator -(int &i)
{return complex(real - i, imag);
}
complex complex::operator *(int &i)
{return complex(real*i, imag*i);
}
complex complex::operator /(int &i)
{return complex(real / i, imag / i);
}
void complex::display()
{cout << "(" << real << "," << imag << "i)" << endl;
}int main()
{complex c1(1, 2), c2(3, 4), c3;int i = 5;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();cout << "i=" << i << endl;c3 = c1 + i;cout << "c1+i=";c3.display();c3 = c1 - i;cout << "c1-i=";c3.display();c3 = c1*i;cout << "c1*i=";c3.display();c3 = c1 / i;cout << "c1/i=";c3.display();return 0;
}


2.使用友元函数完成运算符重载

#include <iostream>
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)i
Complex 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 << "(" << real << "," << imag << "i)" << endl;
}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;
}

类的友元函数可以通过类对象自由地访问该类对象的任何数据成员,这就是友元函数能够作为运算符函数的原因。



 
http://www.lryc.cn/news/2413886.html

相关文章:

  • vb6与access数据库交互常见问题——未完待续
  • activity 的requestCode和resultCode
  • 我的感想十二
  • 能上QQ不能上网的解决方法
  • 实习技术员的基本功(二)
  • 微信表白神秘代码!快发给ta!
  • WIN2003通用GHOST封装教程详解
  • 51单片机学习:独立按键实验
  • android 7.0 iso下载地址,iOS 7.0固件 全系列官方正式版下载地址
  • QQ第三方登录的详细教程
  • Linux操作系统——类UNIX系统
  • 知识付费网课项目有什么好处?
  • 常用网址
  • Smtp/POP3邮箱服务器地址和端口总结(163/126/QQ)
  • java实战demo_JAVA实战
  • pointer(指针)- 重置版
  • 热门的网络营销需求人才
  • Dalvik 和 ART 有什么区别?深扒 Android 虚拟机发展史,真相却出乎意料!
  • 五笔输入法学习
  • Outlook express 报错
  • 完整网页下载,使用webzip
  • 《天引》读书笔记——由新月形面积引发的人类长达2000年的探索。
  • ubuntu在线音乐播放器
  • 新版全图、T人工具 过 浩方 VS 掌门人 三大平台 即Breeze's MH V2.0正式版 0917 发布
  • 计算机毕业设计 jsp通用权限管理系统mysql 毕设
  • QQ被盗的自救、事故分析
  • 拓扑--代数拓扑1
  • NPN PNP SS8050 SS8550 S8050
  • linux下查看chm文件
  • 解决Warning: Cannot modify header information - headers already sent by的方法