运算符重载可以使一些现有的运算符实现一些特定的功能。
运算符重载函数的基本格式:
函数类型 operator@(参数列表) //@代表要重载的运算符
常见的单目运算符:++、–、!、~(按位取反)、-(负号)、*、&(取址)、sizeof等
常见的双目运算符:+、-、*、/、%(取余)、<、>、>=、<=、==、!=、<<、>>、&(按位与)、|(按位或)、&&、||、=等。
不允许重载的五种运算符:
1、. (成员访问运算符)
2、*(成员指针访问运算符)
3、::(域运算符)
4、sizeof (长度运算符)
5、?: (条件运算符)
必须把它作为类成员函数的运算符有:( ),[]、->、=。
双目运算符的重载,如在类外边编写函数(不是类的成员函数),一般使用两个参数,运算符左边是第一个对象,运算符右边传入的是参数(一般为const &类型,因为这里不希望改变参数的值)
返回值类型 operator@(参数1,参数2) //@代表运算符
{
}
在类外边编写的运算符重载函数(不是类的成员函数),如需访问类的私有成员,则需在类内加friend(友元)声明。即friend 函数类型 operator(参数列表)。
如果运算符重载函数为类的成员函数时,参数无中需传入对象本身,因为类的成员函数的参数列表中自带一个隐含的this指针(static成员函数除外)。
下面是一个简单的复数类,实现了两个复数类对象的加、减、乘、除四则运算,由于类内无自带的四则运算符,对象不能直接进行加减乘除,所以需要重载它们来实现两复数间的四则运算:
#include<iostream>
using namespace std;
class CComplex
{
public:
CComplex(double a,double b):m_fReal(a),m_fImag(b)
{//构造函数
}
~CComplex()
{//析构函数
}
void operator+(const CComplex& c)
{//重载+号运算符
m_fReal += c.m_fReal;
m_fImag += c.m_fImag;
}
void operator-(const CComplex &c)
{//重载-号运算符
m_fReal -= c.m_fReal;
m_fImag -= c.m_fImag;
}
void operator*(const CComplex &c)
{//重载*号运算符
double a = m_fReal;
double b = m_fImag;
double d = c.m_fReal;
double f = c.m_fImag;
m_fReal = a*d - b*f;
m_fImag = a*f + b*d;
}
void operator/(const CComplex &c)
{//重载/号运算符
double a = m_fReal;
double b = m_fImag;
double d = c.m_fReal;
double f = c.m_fImag;
m_fReal = (a*d + b*f)/(d*d + f*f);
m_fImag = (b*d - a*f)/(d*d + f*f);
}
double GetReal()
{//获取实部
return m_fReal;
}
double GetImag()
{//获取虚部
return m_fImag;
}
private:
double m_fReal;
double m_fImag;
};
int main()
{
double a,b;
cout << "c1's Real and Imag:" << endl;
cin >> a >> b;
CComplex c1(a,b);
cout << "c2's Real and Imag:" << endl;
cin >> a >> b;
CComplex c2(a,b);
// c1+c2;
// cout << "c1+c2=" << c1.GetReal() << endl;
// c1*c2;
// cout << "c1*c2=" << c1.GetReal() << "+" << c1.GetImag() << "i" << endl;
c1/c2;
cout << "c1/c2=" << c1.GetReal() << "+" << c1.GetImag() << "i" << endl;
return 0;
}