运算符重载使得用户自定义的数据以一种更简洁的方式工作
运算符重载的限制
- 不能重载的运算符 “.” “::” “.*” “?:” “sizeof”
- 不改变运算符的优先级
- 不改变运算符的结合性
- 不改变运算符所需要的操作数
- 不能创建新的运算符
用成员或友元函数重载运算符
运算符可以重载为成员函数或者友元函数
- 重载为成员函数
①一元运算符
Object.operator op()
操作数由对象Object通过this指针隐含传递
②二元运算符
ObjectL.operator op (ObjectR)
左操作数由ObjectL通过this指针传递,右操作数有参数ObjectR传递
成员运算符函数的原型在类的内部声明格式如下:
class X
{
返回类型operator运算符(形参表)
}
在类外定义成员运算符函数格式如下:
返回类型X::operator运算符(形参表)
{
函数体
}
对于双目运算符,成员函数形参表中只有一个参数,它作为运算符操作的右操作数,此时,当前对象作为运算符的左操作数,通过this隐含的传递给函数。
在类中用成员函数重载双目运算符,成员运算符 operator该运算符 所需的一个操作数由对象aa通过this指针隐含地传递,它的另一个操作数bb在参数表中显示,aa,bb都是该类的对象,则下面两种函数调用方法是等价的:
aa运算符bb; //隐式调用
aa.operator运算符(bb); //显示调用
对于单目运算符来说,成员函数的参数表中没有参数,当前对象作为操作数
采用单目运算符时,下面两种方法是等价的:
运算符aa; //隐式调用
aa.operator运算符(); //显示调用
- 重载为友元函数(友元函数不能重载的运算符“=”“()”“[]”“->”)
①一元运算符
operator op(Object)
操作数由参数表的参数Object提供
②二元运算符
operator op(ObjectL,ObjectR)
操作数由参数传递
使用友元函数时需注意:
- 在第一个参数需要隐式转换的情形下,使用友元函数重载
- 友元函数没有this指针,所需操作数都必须在参数表中显示
成员运算符函数与有缘运算符函数的比较
成员运算符函数比友元运算符函数少带一个参数(后置的++、--需要增加一个形参)。
双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但当操作数类型不相同时,必须使用友元函数。
赋值运算符的重载
注意:
赋值运算符重载用于对象数据的复制
operator=必须重载为成员函数
重载方式:
类名&类名::operator=(类名);
重载运算符[]和()
注意:
[]和()是二元运算符
[]和()只能用成员函数重载
格式分别为:
类型 类 ::operator[] (类型)
和
类型 类 ::operator() (参数表)
重载流插入和流提取运算符
istream和ostream是C++的预定义流类
cin是istream的对象,cout是ostream的对象
运算符<<由ostream重载为插入操作,用于输出基本类型数据
重载运算符可以让更快更容易地输入、输出我们需要的自定义数据,可以按照我们规定的方式进行运算,更好的控制不同的数据,是一种很好用的方法。