C/C++ 自定義複數運算類別 範例
C/C++ 自定義複數運算類別 範例
資料來源: https://mp.weixin.qq.com/s/VwogODPifOCKgSKVQE8lcA
線上執行: https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp
https://www.tutorialspoint.com/compile_cpp_online.php
功能:自定義復數類型,實現複數的加、減、乘、除、求共軛複數、乘方、開方等運算。
涉及到的基礎知識點有:
01.運算符重載(+,-,*,/, <<, ^, ==, != 等運算符的重載)
02.友宜函數(友元函數可訪問類的私有屬性)
03.函數返回指向數組的指針。此例中數組的元素是類的對象。
04.左值引用與右值引用
05.主動拋出異常(使用關鍵字throw)
code:
#include <iostream> #include <cmath> using namespace std; class Division_by_zero:exception{}; class NegativeValue:exception{}; class Complex { //类的友元函数,让该函数可以访问类的私有属性 friend ostream & operator<<(ostream& out, Complex& c);//左值引用 friend ostream & operator<<(ostream& out, Complex&& c);//右值引用 friend Complex operator*(double k, Complex& c);//左侧数乘 左值引用 friend Complex operator*(double k, Complex&& c);//左侧数乘 右值引用 private: double re; double im; public: Complex() { re = 0;//实部 im = 0;//虚部 } Complex(double r, double i) { re = r;//实部 im = i;//虚部 } double get_re() { return re; } double get_im() { return im; } double mag() const//计算幅值 { double temp = re*re; temp += im*im; return sqrt(temp); } double ang() const //计算相位角 { return atan2(im, re); } Complex conjugate() const { Complex temp ={0, 0}; temp.re = this->re; temp.im = -this->im; return temp; } //重载加号运算符 Complex operator+(Complex& other) const { Complex temp ={0, 0}; temp.re = this->re + other.re; temp.im = this->im + other.im; return temp; } Complex operator+(Complex&& other) const //右值引用 { Complex temp ={0, 0}; temp.re = this->re + other.re; temp.im = this->im + other.im; return temp; } //重载减号运算符 Complex operator-(Complex& other) const { Complex temp ={0, 0}; temp.re = this->re - other.re; temp.im = this->im - other.im; return temp; } Complex operator-(Complex&& other) const //右值引用 { Complex temp ={0, 0}; temp.re = this->re - other.re; temp.im = this->im - other.im; return temp; } //重载乘号运算符 Complex operator*(Complex& other) const { Complex temp ={0, 0}; temp.re = this->re * other.re - this->im * other.im; temp.im = this->re * other.im + this->im * other.re; return temp; } Complex operator*(Complex&& other) const //右值引用 { Complex temp ={0, 0}; temp.re = this->re * other.re - this->im * other.im; temp.im = this->re * other.im + this->im * other.re; return temp; } Complex operator*(double k) const //右侧数乘 { Complex temp ={0, 0}; temp.re = k * this->re; temp.im = k * this->im; return temp; } //重载除号运算符 Complex operator/(Complex& other) const { double denominator; denominator = other.re * other.re + other.im * other.im; if(denominator==0) { throw Division_by_zero(); } Complex temp ={0, 0}; temp.re = (this->re * other.re + this->im * other.im)/denominator; temp.im = (this->im * other.re - this->re * other.im)/denominator; return temp; } Complex operator/(Complex&& other) const //右值引用 { double denominator; denominator = other.re * other.re + other.im * other.im; if(denominator==0) { throw Division_by_zero(); } Complex temp ={0, 0}; temp.re = (this->re * other.re + this->im * other.im)/denominator; temp.im = (this->im * other.re - this->re * other.im)/denominator; return temp; } //幂运算 Complex operator^(int n) const { if(n<0) { throw NegativeValue(); } Complex temp ={0, 0}; double r = this->mag(); double theta = this->ang(); temp.re = cos(n * theta); temp.im = sin(n * theta); temp = temp * pow(r, n); return temp; } //开n次方 Complex* root(int n) const { if(n<=0)//如果n的类型是 unsigned, 则这句不执行! { throw NegativeValue(); } const double pi = 3.141592653589793238; Complex* p = new Complex[n]; //p指向堆上新建的数组 Complex temp ={0, 0}; double r = this->mag(); double theta = this->ang(); double theta_new = 0.0; double r_new = pow(r, 1.0/n); for(int k=0; k<n; k++) { theta_new = (2.0*k*pi + theta)/n; temp.re = r_new * cos(theta_new); temp.im = r_new * sin(theta_new); p[k] = temp; } return p;//返回数组指针 } //重载等号运算符 bool operator==(Complex& other) const { return this->re == other.re && this->im == other.im; } bool operator==(Complex&& other) const //右值引用 { return (this->re == other.re && this->im == other.im); } //重载不等于等号运算符 bool operator!=(Complex& other) const { return this->re != other.re || this->im != other.im; } bool operator!=(Complex&& other) const //右值引用 { return this->re != other.re || this->im != other.im; } }; //左移运算符重载,用于自定义打印。只能利用全局函数重载左移运算符 ostream & operator<<(ostream& out, Complex& c) { if(c.im >= 0) out<< c.re <<"+" << c.im <<"j"; else out<< c.re << c.im <<"j"; return out; } // 同上,但右值引用 ostream & operator<<(ostream& out, Complex&& c) { if(c.im >= 0) out<< c.re <<"+" << c.im <<"j"; else out<< c.re << c.im <<"j"; return out; } //左侧数乘 Complex operator*(double k, Complex& c) { Complex temp ={0, 0}; temp.re = k * c.re; temp.im = k * c.im; return temp; } Complex operator*(double k, Complex&& c) { Complex temp ={0, 0}; temp.re = k * c.re; temp.im = k * c.im; return temp; } int main() { //测试 Complex c1 ={-1,3}; Complex c2 ={3,4}; Complex c3 = c2; cout.precision(10); cout<<"c1= "<<c1<<endl; cout<<"c1.re = "<<c1.get_re()<<endl; cout<<"c1.im = "<<c1.get_im()<<endl; cout<<"conjugate complex of c1: "<< c1.conjugate() << endl; cout<< "4*c1 = " << 4*c1 << endl; cout<<"c2= " << c2 << endl; cout<<"c3= " << c3 << endl; cout<<"c2.mag= "<< c2.mag() <<endl; cout<<"c1+c2= " << c1+c2 << endl; cout<<"c1-c2= " << c1-c2 << endl; cout<<Complex(-1,-3)<<endl;//Complex(-1,-3)是个常量,属于右值 cout<<Complex(3,5) * Complex(3,5)<<endl; cout<<Complex(3,4) / Complex(5,6)<<endl; //cout<<Complex(3,4) / Complex(0,0)<<endl;//0做分母 cout<<(Complex(3,4)^(9))<<endl; unsigned n = 9; Complex* p = Complex(3,4).root(n); cout << Complex(3,4) << "的" << n << "个" << n << "次方根为:" << endl; for(unsigned i=0; i<n; i++) { cout << "第" << (i+1) << "个" << n <<"次方根为:" << p[i] <<endl; } delete[] p; return 0; }
/* c1= -1+3j c1.re = -1 c1.im = 3 conjugate complex of c1: -1-3j 4*c1 = -4+12j c2= 3+4j c3= 3+4j c2.mag= 5 c1+c2= 2+7j c1-c2= -4-1j -1-3j -16+30j 0.6393442623+0.03278688525j -922077+1721764j 3+4j的9个9次方根为: 第1个9次方根为:1.189471556+0.1229901067j 第2个9次方根为:0.8321315588+0.8587934659j 第3个9次方根为:0.08542795743+1.192757818j 第4个9次方根为:-0.7012483347+0.968617531j 第5个9次方根为:-1.159802738+0.2912503363j 第6个9次方根为:-1.07567255-0.5223961277j 第7个9次方根为:-0.4882232211-1.091607638j 第8个9次方根为:0.3276711787-1.150043802j 第9个9次方根为:0.9902445922-0.6703616903j */