- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 运算符重载 11.1 重载运算符的概念 一个运算符代表一种操作,常用的运算通常可借助一个运算符来实现简单表示,如a+b。 C++允许对运算符进行重载,实质是对表示某种运算的特殊函数进行重载。 11.1.1 重载运算符的函数特征 常见运算对于C++系统的内置类型是有效的,但对于用户定义的数据类型,多数运算不再有效。 11.1.1 重载运算符的函数特征(续) 增加上述函数实现了对加法运算的重载。 使用方式: c = a + b; c = operator+(a, b); 运算符重载可以使程序更容易理解,但并不是必需的。 11.1.1 重载运算符的函数特征(续) 如果@代表一个运算符,则“operator@”是代表@运算的“函数名”。 运算符重载通常是与类定义联系在一起的。 11.1.2 类重载运算符的两种方法 1. 成员和非成员重载 将运算符重载函数定义为友员(普通函数,非成员)和成员(类的方法)。 11.1.2 为类重载运算符的两种方法(续) 2. 采用成员和非成员重载运算符时的函数原型差异 重要差别:函数形参的个数不同。 对于一个n目的运算符,使用友员重载时仍需n个形式参数,而使用成员重载时只有n-1个参数. 原因: 每个类的非静态方法都有一个缺省的this指针作为第一个参数。 类的友元函数则没有this指针。 11.1.2 为类重载运算符的两种方法(续) 3. 不同重载方法对运算符使用形式的影响 对于运算符@来说,采用类的成员函数重载时可以“a@b” 和a. operator@ ( b )两种形式使用运算符,如: Point a(1,1), b(2,3); Point c = a + b; Point c = a.operator + ( b ); 采用友员重载时可以采用运算和函数调用两种语法形式,如: Point d = a + b; Point e = operator+(a, b); 11.1.2 为类重载运算符的两种方法(续) 11.1.2 为类重载运算符的两种方法(续) 4. 使用成员和非成员重载的限制 必须使用成员而不能使用非成员重载: =、- 、( )、[ ] 只能使用友员重载而不能使用类成员重载: 、 如果运算符属于赋值类运算,操作中需要修改当前对象(this),一般使用成员重载: +=、-=、*=、/=、++(前置)、--(前置) 如果运算符的第一个操作数不是当前定义的类类型数据则必须使用友员重载。 11.1.2 为类重载运算符的两种方法(续) 原因:若采用成员时第一个参数必然是this。 11.1.3 重载运算符的限制 ⑴只能重载C++已有的运算符,不能臆造。 ⑵重载时应尽量保持运算符原来的意义,不应“挪为他用”。 ⑶不能改变运算符的本来特性,包括操作数个数、优先级别和结合次序。 ⑷不能改变运算符对基本类型数据的操作方式,不能定义只有内置类型数据为参数的运算符重载。 (5)以下5个C++运算符不能被重载: .(成员访问运算符)、.*(成员指针访问运算符)、 ::(域解析符)、?:(条件运算符)、sizeof 11.2 重载运算符函数的设计 1. 重载运算符的返回值 运算符函数的返回值类型一般都与当前类的类型有关。 运算符函数返回对象的值还是对象引用 原则:如果运算符形成的表达式(函数调用表达式)需要作为左值则返回引用,否则返回值。 11.2 重载运算符函数的设计(续) ⑴+、-、*、/、%、后置的++和-- 因为加法、减法、乘法、除法和后置的加1和减1表达式不能做左值,重载时应返回对象的值,故应采用类似如下的函数原型: Point operator+(...); Point operator++(...); ⑵=、[ ]、前置的++和-- 由于赋值表达式、下标引用变量和前置的加1、减1表达式都可做左值,故应返回对象的引用,如: Point operator=(...); char operator[](...); 11.2 重载运算符函数的设计(续) 2. 运算符函数的引用参数 当运算符需要操作类的对象时,应确定该使用指针还是引用做函数的参数。一般不直接使用类对象做参数,其中的一个重要原因是效率。 此外,如果运算符函数中不修改被引用对象的值,通常要对参数进行常量限制,如: Point operator+(const Point a, const Point b); 11.3 若干常见运算符的重载 一些其它重要的运算符重载。 11.3.1 重载增量运算符++ 1. 前置的++ 前置++遵循一般的单目运算符重载规范,但由于可以作为左值,故函数应该返回当前对象的引用。 11.3.1 重载增量运算符++(续) 11.3.1 重载增
您可能关注的文档
- 编译原理教程 第二版 教学课件 作者 胡元义 第6-8章 第8章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第1章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第2章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第3章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第4章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第5章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第6章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第7章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 第8章.ppt
- 编译原理教程 第三版 教学课件 作者 胡元义 全书 封面及目录.ppt
文档评论(0)