面向对象程序设计语言C++ - 第5章 运算符重载
面向对象程序设计语言C++
面向对象程序设计语言C++电子科技大学示范性软件学院
面向对象程序设计语言C++
第五章 引论当在使用一种程序设计语言编写程序时,我们不仅 要设计新的数据类型,同时还要为新类型设计 运算。一般地,用户定义类型的运算都是用函 数的方式实现的。而在一般情况下,一种类型 的运算都是用运算符表达的,这很直观,语义 也简单。 但是如果直接将运算符作用在用户定义类型之上, 那么编译器将不能识别运算符的语义。因此, 在这种情况下,我们需要一种特别的机制来重 新定义作用在用户定义类型上的普通运算符的 含义。这就是运算符重载的简单概念。
面向对象程序设计语言C++
第五章 引论其实在C编译器里早就存在简单的运算符重载的概 念了。考虑整型和浮点型两种加法运算: int a = 1, b; b = a + 2; float c = 1.0, d; d = c + 2.0; 在上面的两条加法语句中,都用到了运算符“+”。 这符合我们数学常识。但对于C编译器来说,这 两个加法却被翻译成不同的指令。这就是说, “+”运算符至少具有两种不同的解释(实现代 码)。此时我们说, “+”运算符被重载了。 遗憾的是,C仅支持很少量的运算符重载。
面向对象程序设计语言C++
第五章 引论C++扩充了C运算符重载的功能,允许已存在的预 定义运算符由用户在不同的上下文中做出不同 的解释。 我们来看一个实际的例子:当两个字符串类进行连 接的时候,我们可能用到这样的方式:class String { String string_cat(String); … } String str1, str2, str3; str3 = str1.string_cat(str2);
面向对象程序设计语言C++
第五章 引论显然,这不如 str3 = str1 + str2 来的简单明了。但问题是,C++编译器只知道+运 算符是作用在整型和浮点型数据之上的,它不 知道在上述表达式中+运算符的确切含义。因此, 在设计类String时,我们必须重新定义+运算符 的含义。这样一来,语义变得更加清晰和易懂。
面向对象程序设计语言C++
第五章 引论在原来预定义的运算符含义的基础上,再定义对于 某个用户定义类型的对象进行操作的新的含义。 这就是运算符重载。 运算符重载后,其优先级和结合性不变。 在C++中,类型转换函数也被认为是一种特殊的运 算符,所以也能被重载。
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符class Complex { double re, im; public: Complex(double r, double im): re(r), im(i) {} Complex() { re = 0.0; im = 0.0; } Complex add_Complex(Complex c) { Complex temp; temp.re = re + c.re; temp.im = im + c.im; return temp; } };7
考虑复数的加法运算:
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符void main( ) { Complex obj1(1,2),obj2(3,4); Complex obj3=obj1.add_Complex(obj2); … }
考虑复数的加法运算:
使用 obj1.add_Complex(obj2); 表示该函数的调用,不太直观。能不能将2个复数相 加表示为:obj1+obj2 呢?8
面向对象程序设计语言C++
第五章 引论
5.1 重载运算符C++提供了一种将标准定义的运算符用在用户自定 义类型上的方法,称为运算符重载。C++约定,如 果一个成员函数的函数名字是特殊的,即由关键 字operator加上一个运算符构成,如operator+。 因此,obj1+obj2称为函数operator+()的隐式调用形 式; obj1.operator+(obj2) 称为函数operator+()的显示调 用形式; 函数operator+()称为运算符重载函数。
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符class Complex { double re, im; public: Complex(double r, double im): re(r), im(i) {} Complex() { re = 0.0; im = 0.0; } Complex operator+(Complex c) { Complex temp; temp.re = re + c.re; temp.im = im + c.im; return temp; } };10
重载的版本:
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符void main( ) { Complex obj1(1,2),obj2(3,4); Complex obj3=obj1+obj2; … }
考虑复数的加法运算:
程序中的 obj1+obj2 等价于:obj1.operator+(obj2)
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符5.1.1运算符重载的语法形式 运算符重载的语法形式在C++中,运算符通过一个运算符重载函数进行重载。运算 符重载可以采用成员函数和普通函数两种重载方式,语法 形式如下: (1)运算符重载函数为成员函数的语法形式为: type Class_Name::operator@(参数表) { //相对于Class_Name类而定义的操作 } 其 中 , type 是 返 回 类 型 , “@” 是 要 重 载 的 运 算 符 符 号 , Class_Name 是 重 载 该 运 算 符 的 类 的 类 名 , 函 数 名 operator@是关键字operator后跟要重载的运算符符号“@” 。这里用“@”泛指能被重载的运算符。
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符5.1.1运算符重载的语法形式 运算符重载的语法形式 (2)运算符重载函数为友元函数的语法形式为: type operator@(参数表) { //相对于该类而定义的操作 }
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符5.1.2 重载运算符规则 (1)大多数系统预定义的运算符可以通过运算符重载 函数定义它们对用户定义类型进行操作的新的含 义。只有少数的C++语言的运算符不能重载: :: Sizeof ?: . .* 域运算符和sizeof运算符的运算对象是类型而不是变 量或者一般表达式,不具备重载的特征,而成员 访问运算符和成员指针访问运算符不能重载是为 了保证访问成员的功能不能被改变。
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符5.1.2 重载运算符规则 (2)只能对已有的C++运算符进行重载,C++允许用 户自己定义新的运算符,如“$”和“**”等。对于不 是运算符的符号,如“;”等是不能重载的,C++语 言不允许的运算符也不能重载, (3)重载运算符时,不能改变它们的优先级,不能改 变它们的结合性,也不能改变这些运算符所需操 作数的数目。 (4)重载运算符的函数不能有默认的参数,否则就改 变了运算符所需要的
操作数的数目。15
面向对象程序设计语言C++
第五章 引论 5.1 重载运算符5.1.2 重载运算符规则 (5)重载的运算符必须和用户自定义类型的对象一起 使用,其参数至少应用一个是类对象(或类对象 的引用)。也就是说,参数不能全部是C++的标 准类型,以防止用户修改用于标准类型数据的运 算符的性质。 (6)用于类对象的运算符一般必须重载,只有两个运 算符:赋值运算符‘=’和地址运算符‘&’可以不 必重载。
…… 此处隐藏:1987字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [初中教育]婚姻家庭法学教学教案
- [初中教育]浅谈小学语文教学中的创新教育
- [初中教育]中华人民共和国侵权责任法2009
- [初中教育]2016-2022年中国薄膜太阳能电池行业发
- [初中教育]多级轻型井点降水的应用
- [初中教育]外语教学法流派介绍和简评
- [初中教育]实验一、典型环节及其阶跃响应
- [初中教育]内蒙古2012-2013学年度国家奖学金获奖
- [初中教育]移动通信营销渠道管理探讨
- [初中教育]初三化学第一学期第一第二章基础知识点
- [初中教育]一天的食物教学设计
- [初中教育]光导照明系统的基本结构及工作原理
- [初中教育]长春市十一高、东北师范大学附属中学、
- [初中教育]“十三五”规划重点-配重式装卸车项目
- [初中教育]领导方法和领导艺术
- [初中教育]第三章 植物病虫草鼠害诊断与防治基
- [初中教育]2019届九年级语文上册 第二单元 6纪念
- [初中教育]甲级单位编制水豆腐项目可行性报告(立
- [初中教育]Ch8-1补充 09101数据库系统原理及应用-
- [初中教育]2017-2023年中国吊装设备行业市场分析
- 制作毕业纪念册需要哪些材料
- 2015-2016学年高二化学苏教版选修4课件
- 哈佛管理导师-创建商业案例
- 职场交际中的谈吐礼仪知识与职场会议接
- 中国糕点及面包行业发展现状与竞争战略
- 沂河“12·7”洪水茶山拦河坝
- 管道水流量计算公式
- 4-2发电机火灾事故处置方案
- 数字信号处理实验五
- 2009年经济师(中级)金融专业知识全真试
- 历史街区保护规划--04历史文化遗产保护
- 宁夏回族自治区中小学职称评价标准
- 评先评优测评表
- 圆的切线证明及线段长求解在在中考中的
- 【解析版】2015年江苏省南京外国语学校
- 人教版八年级上册科学第一章习题精华
- 责任心与执行力
- SA8000社会责任管理体系标准培训
- IgA肾病的饮食应注意
- 杭州市建设工程文件归档整理方案(试行)




