运算符重载和类型转换
主要内容
运算符重载的目的 运算符重载概述 重载的规则和限制 如何重载运算符 常见运算符的重载 类型转换 小结
class Complex { public: Complex(float r=0, float i=0) { real=r; image=i;} Complex add(const Compex &c) { return Complex(real + c.real, image+c.image);} private: float real, image; };
>>=
Байду номын сангаас
<<=”,
若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则 只能选用友元函数。 当需要重载运算符的运算具有可交换性时,选择重载为友元函数。 >> << 作为提取和插入运算符使用时,只能用友元函数重载
void main() { int i = 29, j = 870, k; float x = 2.6, y = 2.4; k = i + j; float z = x + y; Complex c1(3.2,4.6), c2(6.2,8.7), c3; c3 = c1.add(c2); }
运算符重载概述
重载为类的友元函数
此时运算所需的操作数都是通过函数的参数表来传递,在参数表中形 参从左到右的顺序就是运算符操作数的顺序。 双目运算符 B重载后, (ch18_2) 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, B oprd 等同于 operator B(oprd ) 后置单目运算符 ++和- -重载后,此时函数的形参有两个,一个是类 的对象,另一个是整型(int)形参 oprd B 等同于 operator B(oprd,0 )
重载为类的成员函数
双目运算符 B 如果要重载 B 为类的成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的 成员函数,形参类型应该是 oprd2 所属的类型。 经重载后, oprd1 B oprd2 相当于 oprd1.operator B(oprd2) 前置单目运算符 U 如果要重载 U 为类成员函数,使之能够实现表达式 U oprd, 其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数, 无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()
运算符是一些系统预定义的函数名称,即用一些特定的符号 表示各种运算。每个运算符对运算数据都有一定要求。 C++中预定义的运算符的操作对象只能是基本数据类型,实 际上,对于很多用户自定义类型,也需要有类似的运算操作, 这就提出了对运算符进行重新定义,赋予已有符号以新功能 的要求。
运算符重载是对已有的运算符赋予多重含义,同一个运算符 作用于不同类型的数据导致不同类型的行为。
运算符函数
定义运算符重载函数的一般格式: <type> operator @(<arg>) { ...... //函数体 } type为函数返回值的类型;@为要重载的运算符;arg为函数的形参表,
operator是关键字,它与其后的运算符一起构成函数名。 为了提高访问效率,运算符重载函数通常需要直接访问对象的私有或保护的 数据成员,因此运算符重载函数通常为类的成员函数或者友元函数。
后置运算符“++” 和“ ” 如果要实现表达式oprd++或oprd ,其中oprd为A 类 对象,那么运算符重载函数中要带一个整型(int)形参。 经 重载后, oprd++ 相当于 oprd.operator ++(0) oprd 相当于 oprd.operator (0) 前增量与后增量的区别 使用前增量时,对对象(操作数)进行增量修改,然后 再返回该对象,参数与返回的是同一个对象 使用后增量时,必须在增量之前返回原有的对象。后增 量操作返回的是原有对象值,不是原有对象,原有对象已 经被增量修改。
习惯形式 a+b -a a++
友元调用形式 operator+(a,b) operator-(a) operator++(a,0)
成员调用形式 a. operator+(b) a. operator-( ) a. operator+(0)
成员与友元运算符函数选取经验
对于单目运算符,建议选择成员函数。 对于运算符“= ()[ ] -> ”只能作为成员函数。 对于运算符“ += -= /= *= &= != ~= %= 建议重载为成员函数。 对于其他运算符,建议重载为友元函数。 类型转换函数只能定义为一个类的成员函数。
运算符重载的实质就是函数重载。在实现过程中,首先把指 定的运算表达式转化为对运算符函数的调用,运算对象转化 为运算符函数的实参,然后根据实参的类型来确定需要调用 的函数,这个过程是在编译过程中完成的。
运算符重载的规则和限制
不可以重载的运算符有:. .* :: ?: sizeof 只能重载C++语言中已有的运算符,不可臆造新的。 运算符重载后优先级和结合性都不会改变, 不能改变操作数个数,单目只能重载为单目运算符,双目只能重载为双目运算 符 不能改变运算符对预定义类型数据的操作方式,即重载运算符时,其操作数 中至少应该有一个是自定义类型。 重载的运算符应保持其原有的基本语义。 C++ 规定:= -> ( ) [ ] 只能重载为成员函数形式: >> << 作为提取和插入运算符使用时,只能用友元函数重载
两种重载形式的比较
对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函 数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而 友元运算符函数带有一个参数 。 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但 有一种情况必须使用友元函数,如加法运算。 运算符函数调用形式