运算符重载

一、运算符重载

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载后,原有的基本语义不变,包括:1、不改变运算符的优先级;2、不改变运算符的结合性;3、不改变运算符所需要的操作数。以下运算符不能被重载:.和.*和::和?:和sizeof。不能创建新的运算符,只有系统预定义的运算符才能被重载。

语法形式。运算符函数是一种特殊的成员函数或友元函数。成员函数的语句格式为:类型类名::operator op(参数表){相对于该类定义的操作}。其中,类型是指函数的返回类型,类名是要重载的运算符的类,op表示要重载的运算符,函数名是operatorop,由关键字operator和被重载运算符op组成,参数表列出该运算符所需要的操作数。

用于类运算的运算符通常都要重载,但有两个运算符系统提供默认重载版本:1、赋值运算符=,默认为对象数据成员的复制;2、地址运算符&,默认重载为返回任何类对象的地址。当然我们也可以根据需要进行重载。

二、用成员或友元函数重载运算符。

它们的关键区别在于,成员函数具有指针,而友元函数没有指针。

一元运算符,不论前置还是后置,都要有操作数。Object op或op Object。当重载为成员函数时,编译器解释为Object.operator op(),参数表为空。当重载为友元函数时,解释为operator op(Object),操作数由参数表提供。

二元运算符,需要有左右操作数,ObjectL op ObjectR,当重载为成员函数时,解释为ObjectL.operatorop(ObjectR),左操作数由this指针传递,右操作数由参数表传递。重载为友元函数,解释为operator op(ObjectL,ObjectR)。

三、几个典型的运算符重载。

1前置自增表达式

++Aobject,若用成员函数重载,解释为Aobject.operator++(),函数原型A&A::operator++(),若用友元函数重载,operator++(Aobject),原型friend A&operator++(A&)

2后置自增表达式

Aobject++,成员函数重载Aobject.operator++(0),原型A&A::operator++(int)。友元函数重载operator++(Aobject,0),原型friendA&operator++(A&,int)。其中,0是一个伟值,用于区别。

3重载赋值运算符

赋值运算符重载用于对象数据的复制,只能用成员函数重载。原型为

类名&类名::operator=(类名)

4重载运算符()和[]

重载下标运算符[ ],是二元运算符,其调用一般形式:对象[表达式]

重载函数调用运算符(),可以看成二元运算符。一般形式:对象[表达式],表达式可以为空。

 

你可能感兴趣的:(运算符重载)