编程小白浅谈基于c++的运算符重载(一、复数非友元+友元):
using namespace std;
class Complex
{
private:
double m_real; //实部
double m_img; //虚部
public:
Complex(double real = 0, double img = 0):m_real(real),m_img(img){} //构造函数(可省略,小白写是为了方便初始化)
Complex operator +(Complex c); //复数 + 重载函数
Complex operator -(Complex c); //复数 - 重载函数
Complex operator *(Complex c); //复数 * 重载函数
Complex operator /(Complex c); //复数 / 重载函数
bool operator ==(Complex c); //复数 ==重载函数
bool operator !=(Complex c); //复数 !=重载函数
void display(); //打印函数
};
void Complex::display() //不解释了
{
if(m_img >= 0)
cout << m_real << "+" << m_img << "i" <<endl;
else
cout << m_real << m_img << "i" <<endl;
}
Complex Complex::operator+(Complex c) //首先是返回值Complex,再是Complex类,operator是运算符重载的格式
//本来“+”是双目运算符,如果用友元函数要传两个参数,但是Complex类中自己有m_real和m_img所以就传一个就够了
{
Complex result;
result.m_real = m_real + c.m_real;
result.m_img = m_img + c.m_img;
return result;
}
Complex Complex::operator-(Complex c)
{
Complex result;
result.m_real = m_real - c.m_real;
result.m_img = m_img - c.m_img;
return result;
}
Complex Complex::operator*(Complex c)
//乘法思路eg:(2+i)*(3+2i)= 2*3(实)+ 2*2i(虚)+ i*3(虚)+ 2i*i(实且为负)
{
Complex result;
result.m_real = m_real * c.m_real - m_img * c.m_img;
result.m_img = m_real * c.m_img + m_img * c.m_real;
return result;
}
Complex Complex::operator/(Complex c)
//除法思路eg:(2+i)/(3+2i)分子分母同乘(3-2i)
// 分子(2+i)*(3-2i)= 2*3(实)- 2*2i(虚)+ i*3(虚)- 2i*i(实且为负)
// 分母(3+2i)*(3-2i)= 3*3(实)- 2i*2i(实且为负)
// 这样分子的虚部和实部分别与分母相除就可以计算复数除法
{
Complex result;
double d = m_real * c.m_real + m_img * c.m_img;
result.m_real = (m_real * c.m_real + m_img * c.m_img) / d;
result.m_img = (- m_real * c.m_img + m_img * c.m_real) / d;
return result;
}
bool Complex::operator == (Complex c) //返回值是bool型,不是true就是false
{
return m_real == c.m_real && m_img == c.m_img;
}
bool Complex::operator != (Complex c)
{
return m_real != c.m_real || m_img != c.m_img;
}
--------------------------------------------------------------------------
using namespace std; //友元不解释
class Complex
{
private:
double m_real;
double m_img;
public:
Complex(double real = 0, double img = 0):m_real(real),m_img(img){}
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);
friend bool operator ==(Complex c1, Complex c2);
friend bool operator !=(Complex c1, Complex c2);
void display();
};
void Complex::display()
{
if(m_img >= 0)
cout << m_real << "+" << m_img << "i" <<endl;
else
cout << m_real << m_img << "i" <<endl;
}
Complex operator+(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real + c2.m_real;
result.m_img = c1.m_img + c2.m_img;
return result;
}
Complex operator-(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real - c2.m_real;
result.m_img = c1.m_img - c2.m_img;
return result;
}
Complex operator*(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real * c2.m_real - c1.m_img * c2.m_img;
result.m_img = c1.m_real * c2.m_img + c1.m_img * c2.m_real;
return result;
}
Complex operator/(Complex c1, Complex c2)
{
Complex result;
double d = c1.m_real * c2.m_real + c1.m_img * c2.m_img;
result.m_real = (c1.m_real * c2.m_real + c1.m_img * c2.m_img) / d;
result.m_img = (- c1.m_real * c2.m_img + c1.m_img * c2.m_real) / d;
return result;
}
bool operator == (Complex c1, Complex c2)
{
return c1.m_real == c2.m_real && c1.m_img == c2.m_img;
}
bool operator != (Complex c1, Complex c2)
{
return c1.m_real != c2.m_real || c1.m_img != c2.m_img;
}
using namespace std;
class Complex
{
private:
double m_real; //实部
double m_img; //虚部
public:
Complex(double real = 0, double img = 0):m_real(real),m_img(img){} //构造函数(可省略,小白写是为了方便初始化)
Complex operator +(Complex c); //复数 + 重载函数
Complex operator -(Complex c); //复数 - 重载函数
Complex operator *(Complex c); //复数 * 重载函数
Complex operator /(Complex c); //复数 / 重载函数
bool operator ==(Complex c); //复数 ==重载函数
bool operator !=(Complex c); //复数 !=重载函数
void display(); //打印函数
};
void Complex::display() //不解释了
{
if(m_img >= 0)
cout << m_real << "+" << m_img << "i" <<endl;
else
cout << m_real << m_img << "i" <<endl;
}
Complex Complex::operator+(Complex c) //首先是返回值Complex,再是Complex类,operator是运算符重载的格式
//本来“+”是双目运算符,如果用友元函数要传两个参数,但是Complex类中自己有m_real和m_img所以就传一个就够了
{
Complex result;
result.m_real = m_real + c.m_real;
result.m_img = m_img + c.m_img;
return result;
}
Complex Complex::operator-(Complex c)
{
Complex result;
result.m_real = m_real - c.m_real;
result.m_img = m_img - c.m_img;
return result;
}
Complex Complex::operator*(Complex c)
//乘法思路eg:(2+i)*(3+2i)= 2*3(实)+ 2*2i(虚)+ i*3(虚)+ 2i*i(实且为负)
{
Complex result;
result.m_real = m_real * c.m_real - m_img * c.m_img;
result.m_img = m_real * c.m_img + m_img * c.m_real;
return result;
}
Complex Complex::operator/(Complex c)
//除法思路eg:(2+i)/(3+2i)分子分母同乘(3-2i)
// 分子(2+i)*(3-2i)= 2*3(实)- 2*2i(虚)+ i*3(虚)- 2i*i(实且为负)
// 分母(3+2i)*(3-2i)= 3*3(实)- 2i*2i(实且为负)
// 这样分子的虚部和实部分别与分母相除就可以计算复数除法
{
Complex result;
double d = m_real * c.m_real + m_img * c.m_img;
result.m_real = (m_real * c.m_real + m_img * c.m_img) / d;
result.m_img = (- m_real * c.m_img + m_img * c.m_real) / d;
return result;
}
bool Complex::operator == (Complex c) //返回值是bool型,不是true就是false
{
return m_real == c.m_real && m_img == c.m_img;
}
bool Complex::operator != (Complex c)
{
return m_real != c.m_real || m_img != c.m_img;
}
--------------------------------------------------------------------------
using namespace std; //友元不解释
class Complex
{
private:
double m_real;
double m_img;
public:
Complex(double real = 0, double img = 0):m_real(real),m_img(img){}
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);
friend bool operator ==(Complex c1, Complex c2);
friend bool operator !=(Complex c1, Complex c2);
void display();
};
void Complex::display()
{
if(m_img >= 0)
cout << m_real << "+" << m_img << "i" <<endl;
else
cout << m_real << m_img << "i" <<endl;
}
Complex operator+(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real + c2.m_real;
result.m_img = c1.m_img + c2.m_img;
return result;
}
Complex operator-(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real - c2.m_real;
result.m_img = c1.m_img - c2.m_img;
return result;
}
Complex operator*(Complex c1, Complex c2)
{
Complex result;
result.m_real = c1.m_real * c2.m_real - c1.m_img * c2.m_img;
result.m_img = c1.m_real * c2.m_img + c1.m_img * c2.m_real;
return result;
}
Complex operator/(Complex c1, Complex c2)
{
Complex result;
double d = c1.m_real * c2.m_real + c1.m_img * c2.m_img;
result.m_real = (c1.m_real * c2.m_real + c1.m_img * c2.m_img) / d;
result.m_img = (- c1.m_real * c2.m_img + c1.m_img * c2.m_real) / d;
return result;
}
bool operator == (Complex c1, Complex c2)
{
return c1.m_real == c2.m_real && c1.m_img == c2.m_img;
}
bool operator != (Complex c1, Complex c2)
{
return c1.m_real != c2.m_real || c1.m_img != c2.m_img;
}