【C++学习】运算符重载
参考
为什么会有运算符重载?
运算符,例如+,-,*,/只能对基本类型的常量或者变量进行运算,不能用于对象之间的运算,但在实际编程过程中会存在很多自定义的类型需要进行运算操作,此时原本的基本运算符不在适用,就需要对其进行拓展,即运算符重载,从而进行这些对象之间的运算.
什么是运算符重载?
“重载"——重新定义——创建运算符函数——对原本的运算符函数重载
运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的.
运算符重载格式:
<返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }
举例:复数类的运算符+,-,*,/重载
class Complex//复数类
{
int Real;
int Image;
public:
Complex(int r=0,int i=0) :Real(r),Image(i)//构造函数
{
cout << "Creat Complex" << this << endl;
}
~Complex()//析构函数
{
cout << "Destroy Complex" << this << endl;
}
void Print()const//输出打印方法
{
cout << "Real: " << Real << "Image: " << Image << endl;
}
//+重载
Complex operator +(const Complex& c) const
{
return Complex(this->Real + c.Real, this->Image + c.Image);
}
//-重载
Complex operator -(const Complex& c) const
{
return Complex(this->Real - c.Real, this->Image - c.Image);
}
///重载
Complex operator /(const Complex& c) const
{
return Complex((Real * c.Real + Image * c.Image) / (c.Real * c.Real + c.Image * c.Image),
(Image * c.Real - Real * c.Image) / (c.Real * c.Real + c.Image * c.Image));
}
//*重载
Complex operator *(const Complex& c)const
{
return Complex((this->Real * c.Real) - (this->Image * c.Image), (this->Image * c.Real) + (this->Real * c.Image));
}
}
运算符重载时所需要遵守的一些规则
1.不能够重载的运算符:
"."//类关系运算符;
".*"//成员指针运算符;
"sizeof"//;
"::"//作用域运算符;
"?:"//三目运算符;
2.运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
3.重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。
4.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
5.运算符重载不能改变该运算符用于内部类型对象的含义。(不会覆盖原始的定义,是一种拓展——函数重载)
它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。
6.运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。
运算符重载时的this指针
当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。
(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
(2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
(3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。
调用成员函数运算符的格式如下:
<对象名>.operator <运算符>(<参数>) 它等价于 <对象名><运算符><参数> 例如:a+b等价于a.operator +(b)