6.1运算符重载的规则
运算符重载:同一个运算符由于所操作的数据类型不同而具有不同的意义,就是运算符重载。
准确一点来说,运算符重载就是赋予已有的运算符多重含义
6.1.1运算符重载的规则
- 重载运算符必须符合语言语法
- 不能重载对内部c++数据类型进行操作的运算符(例如不能重载二元浮点减法运算符)
- 不能创建新的运算符
- 不能重载下面的运算符:
. 类成员选择运算符
.*成员指针运算符
:: 作用域运算符
?:条件表达式运算符
除此之外的运算符都可以被重载,并且只有“=”的重载函数不能被继承 - 重载运算符要保持原有的基本语义不变
四个“不能改变”
- 不能改变运算操作数的个数
- 不能改变运算符原有的优先级
- 不能改变运算符原有的结合性
- 不能改变运算符原有的语法结构
6.1.2编译程序选择重载运算符的规则
因为运算符重载是一个函数,所以运算符的重载实际上是函数的重载。
编译程序对运算符重载的选择,是遵循函数重载的选择规则
运算符重载的形式
运算符函数必须被重载为非静态成员函数,或被重载为友元函数。【为了使运算符函数能够访问类中声明的私有成员】
6.2.1用成员函数重载运算符
原型<返回值类型>operator<运算符>(<形式参数表>)
- <返回值类型>可以是任何有效类型,不过通常是返回操作类的对象
- <运算符>表示要重载的运算符
- <形式参数表>中的参数个数和重载的运算符操作数的个数有关
【由于每个非静态成员函数都带有一个隐含的自引用参数this指针,
对于一元运算符函数,不用显式声明形参,所需要的形参将由自引用参数提供,
对于二元运算符函数,只需显示声明右操作数,左操作数则由自引用参数提供】
举个例子:用成员函数重载运算符,实现复数的二元加减法
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(double r=0.0,double i=0.0);
Complex operator + (Complex c);//重载二元加
Complex operator - (Complex c);//重载二元减
void display();
private:
double real,imag;
};
Complex::Complex(double r,double i)
{
real=r;imag=i;
}
Complex Complex::operator +(Complex c)
{
Complex temp;
temp.real=real+c.real;
temp.imag=imag+c.imag;
return temp;
}
Complex Complex::operator -(Complex c)
{
Complex temp;
temp.real=real-c.real;
temp.imag=imag-c.imag;
return temp;
}
void Complex::display()
{
char *str;
str = (imag<0)?"":"+";
cout<<real<<str<<imag<<"i"<<endl;
}
int main()
{
Complex c1(12.4,13.3),c2(14.4,26.5);
Complex c;
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
c=c1+c2;
cout<<"c1+c2=";
c.display();
c=c1-c2;
cout<<"c1-c2=";
c.display();
return 0;
}