第13章 运算符重载
2021/2/24 1 第13章 运算符重载
运算符重载 C++中允许使用者重新定义已有的运算,使之能按用 户规定的要求完成某些特定的操作,称运算符重载。 运用运算符重载可完成对象间的复杂操作,如加、 减法等 重载运算符 完成运算符重载的函数称为运算符重载函数。定义 算符重载函数的一般格式为: 返 值的类型类名porc数符 类型 运算件数所在的类 2021/224
2021/2/24 2 运算符重载 C++中允许使用者重新定义已有的运算,使之能按用 户规定的要求完成某些特定的操作,称运算符重载。 运用运算符重载可完成对象间的复杂操作,如加、 减法等。 重载运算符 完成运算符重载的函数称为运算符重载函数。定义 运算符重载函数的一般格式为: 类型 类名::operator @(参数表) {…} //函数体 关键字 重载运算符 函数 返回 值的 类型 运算符重载函数所在的类
例1:定义一个复数类,重载“+”和“-”运算符,使 这两个运算符能直接完成复数的加法和减法运算。 执行后输出: Real 55 Image=50 1301 R ea Image=50 Real=125 Image=250 Real=150 Image=300 Real=250 Image=500 注 1.优先级和结合顺序不变 2.不能改变目数,单目无参数双目一个参数 3重载函数名必须为 operator,后接一个合法的运 算符 2021/2/24
2021/2/24 3 例1:定义一个复数类,重载“+”和“-”运算符,使 这两个运算符能直接完成复数的加法和减法运算。 1301 执行后输出: Real=25 Image=50 Real=25 Image=50 Real=125 Image=250 Real=150 Image=300 Real=250 Image=500 注: 1. 优先级和结合顺序不变 2 .不能改变目数,单目无参数双目一个参数 3 .重载函数名必须为operator,后接一个合法的运 算符
4C++中允许重载的运算符如下表: 81 > 88 〓 /=% A 81 = -> new delete 2021/224
2021/2/24 4 + - * / % ^ & | ~ ! , = = ++ - - > == != && || += -= *= /= %= ^= &= |= >= [ ] ( ) -> ->* new delete 4.C++中允许重载的运算符如下表:
5C++中不允许重载的运算如下表: 运算符运算符的含义不允许重载的原因 三目运算符在C十中没有定义一个三目运算 符的语法 成员操作符为保证成员操作符对成员访间的 安全性,故不允许重载 成员指针操作符同上 作用域操作符|因该操作符左边的操作数是一个 ier求字节数操作符其操作数是一个类型名,而不是 20212/24
2021/2/24 5 运算符 运算符的含义 不允许重载的原因 ?: 三目运算符 在C++中没有定义一个三目运算 符的语法 . 成员操作符 为保证成员操作符对成员访问的 安全性,故不允许重载 * 成员指针操作符 同上 :: 作用域操作符 因该操作符左边的操作数是一个 类型名,而不是一个表达式 sizeof 求字节数操作符 其操作数是一个类型名,而不是 一个表达式 5.C++中不允许重载的运算如下表:
元运算符的重载 元运算符重载的一般格式: 类型类名: operator单目运算符() /数体 “++和“-”-元运算符存在前置与后置的问题。如对 “++”运算符。 “++”前置时运算符重载函数的一般格式 类型类名: operator++() “--”运算符 数体 与“++”类似 “++”后置时运算符重载函数的一般杓 类型类名: coperator+t(int) 函数体 没有实际意 2021/224 义,仅用作 6
2021/2/24 6 一元运算符的重载 一元运算符重载的一般格式: 类型 类名::operator 单目运算符() {…} //函数体 “++”和“--”一元运算符存在前置与后置的问题。如对 “++”运算符。 “++”前置时运算符重载函数的一般格式: 类型 类名::operator ++() {…} //函数体 “++”后置时运算符重载函数的一般格式: 类型 类名::operator ++(int) {…} //函数体 没有实际意 义,仅用作 区分 “- -”运算符 与“++”类似
例2:用一个类来描述人民币币值,用两个数据成员 分别存放元和分。重载“++”运算符,实现对象的加1 运 执行后输出: 1302 2550 51 运算符重载 25 函数不能定 51 105 70.9997 义为静态的 105 成员函数 70.9997 11097成员函数实现运算符重载时, 运算符的左操作符为当前对象 ,并要用到隐含的指针this 2021/224
2021/2/24 7 例2:用一个类来描述人民币币值,用两个数据成员 分别存放元和分。重载“++”运算符,实现对象的加1 运算。 1302 执行后输出: 25 50 25 51 25 51 105 70.9997 105 70.9997 1109元 97.3476 成员函数实现运算符重载时, 分 运算符的左操作符为当前对象 ,并要用到隐含的指针this。 运算符重载 函数不能定 义为静态的 成员函数
友元运算符 两种实现运算符重载的方法: °用类的成员函数实现 用类的友元函数实现,称为友元运算符 重载一元运算符的友元函数的一般核运算符重 载函数是 friend类型 operator@(类名X 类名X的 一元运算符加友元 重载二元运算符的友元函数的一般格式 两个参数 friend类型 operator@(参数1说明中至少有 明) 二元运算符 个是类 /函线的对象 2021/2/24 8
2021/2/24 8 友元运算符 两种实现运算符重载的方法: •用类的成员函数实现 •用类的友元函数实现,称为友元运算符。 重载一元运算符的友元函数的一般格式: friend 类型 operator @ (类名X &对象名) {…} //函数体 运算符重 载函数是 类名X的 友元 重载二元运算符的友元函数的一般格式: friend 类型 operator @ (参数1说明,参数2说 明) {…} //函数体 一元运算符 二元运算符 两个参数 中至少有 一个是类 X的对象
例3:用友元运算符实现复数的运算,包括二元 运算符“+”、一元运算符“”,用成员函数实现 “+=”运算。 执行后输出: 1303 Real=25 Image=50 Real Image=50 Real=125 Image=250 Real=150 Image=300 Real=250 Image=5n Rea|=450 Image-两种实现运算符重 Rea|=450mage载的方法,用法相 同,但编译器的处 理不同。 2021/224 9
2021/2/24 9 例3:用友元运算符实现复数的运算,包括二元 运算符“+”、一元运算符“-”,用成员函数实现 “+=”运算。 1303 执行后输出: Real=25 Image=50 Real=25 Image=50 Real=125 Image=250 Real=150 Image=300 Real=250 Image=500 Real=450 Image=500 Real=-450 Image=-500 两种实现运算符重 载的方法,用法相 同,但编译器的处 理不同
将对象内的成员数 转换函数 据转换成指定类型 转换函数(或称类型转换函数)是类中定义的 个成员函数。一般格式为 类名: operator类型() 要转换后的 /函数体 数据类型 例4:定义一个类,类中包含元、角、分,要把这 个数变成一个等价的实数。 执行后输出 1304 s1=307s2=120.55 s3=30.7s4=12055 5=30.756=30.7 2021/2/24 10
2021/2/24 10 转换函数 转换函数(或称类型转换函数)是类中定义的 一个成员函数。一般格式为: 类名::operator 类型() {…} 要转换后的 //函数体 数据类型 将对象内的成员数 据转换成指定类型 的数据 例4:定义一个类,类中包含元、角、分,要把这 三个数变成一个等价的实数。 执行后输出: 1304 s1=30.7 s2=120.55 s3=30.7 s4=120.55 s5=30.7 s6=30.7