C++面向对象运算符重载规范.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
由于关键字operator的作用,函数operator+通常调用形式: * * * 复数的算术运算定义: (a+bi)+(c+di)=(a+c)+(b+d)i (a+bi)-(c+di)=(a-c)+(b-d)i (a+bi) ×(c+di)=(ac-bd)+(ad+bc)i (a+bi) /(c+di)=(ac+bd)/(c2+d2)+[(bc-ad)/(c2+d2 )]i * 对于重载的操作符,也是在编译时,根据操作数的类型,决定使用该操作符的哪种语义。 * * 必须以类成员函数的形式进行重载,保证第一个操作数是类的对象。 用成员函数实现操作符重载,可以解决私有和保护数据成员的信息泄漏的问题 有的情况下,只能用顶层函数来实现操作符重载 被重载的操作符可以是类成员函数也可以是顶层函数。 其中的[]、=、()、-必须以类成员函数的形式进行重载。 除内存管理操作符new、new[]、delete、delete[],一个以顶层函数形式被重载的操作符必须在它的参数表中包含一个类的对象,以便让编译器分辨出操作符是内建的还是用户自定义的。 * 成员函数重载二元操作符时,只需要一个参数,重载一元操作符时,不需要参数. 顶层函数重载二元操作符时,需要两个参数,重载一元操作符时,需要一个参数. * * 只要定义了可用于转型的构造函数 * * friend的含义是如果函数f是类C的friend,f就可以存取C的private和protected成员 C++允许使用关键字friend在一个类的内部将一个全局非成员函数、另一个类的成员函数、或另外一个类说明为该类的友元。作为一个类的友元函数可以访问该类的所有成员(包括公有和私有的数据成员和成员函数)。友元函数不是类的成员函数,不能被声明为const,也没有this指针 在友元函数体内只能通过作为友元函数参数传递进来的对象名、对象指针或对象引用来访问对象成员 友元函数在类定义花括号内声明的一般格式为: friend 函数返回类型 友元函数名(类名 对象名,…); 友元函数定义的格式同一般的全局函数相同,为: 函数返回类型 友元函数名(类名 对象名,…) { 函数体 } Question: 为什么友元函数的形参最好用类对象的引用,而不用类对象名? * 提取操作符用于输入,插入操作符用于输出。 提取操作符的第一个操作数是系统类的对象,而这些重载函数是以类成员函数的形式实现的。 * 输入流以引用方式,系统为了接受输入信息,需要更新输入流对象的信息 Complex对象以引用方式,因为需要修改其数据成员. 例如:重载来读取2个浮点数,并将其转换成复数,存入一个Complex对象中。 需要存取私有成员,声明为friend函数。 * * 赋值操作符是双目操作符 可以使用缺省的赋值操作符实现类的赋值 如:Complex c1(20,10),c2; c2=c1 表示将c1的数据成员逐个赋给c2的对应数据成员,即 c2.real=20; c2.imag=10; 通过重载赋值操作符可以解决指针悬挂问题; C++规定:赋值操作符必须使用成员函数重载,且重载赋值操作符的成员函数operator=不能被继承。 解决上述问题的指导思想是: (1)在赋值之前,先释放s1.p原先指向的内存空间; (2)s1.p重新申请内存空间; (3)内容传递:对目的对象s1的数据成员指针p(即s1.p)的赋值,是把源对象s2的数据成员指针p (即s2.p)所指向的内容传递给它,而不是简单地传递指针值; * * 在3. 5节,分析了编译器版本拷贝构造函数的危险,同理,如果使用编译器版本的赋值操作符会出现类似的问题 1.指针悬挂问题。 2.s1.p和s2.p都指向同一块内存区,当s1和s2这两个对象生存期结束时,将调用两次析构函数,从而使这块内存被释放两次。 * d1没有调用set成员函数,但d1的内容改变了,这是一个非常微妙的错误。 编译器提供的拷贝构造函数直接赋值,使得两个指针d1.p、d2.p指向了同一个存储区域。 Namelist d2=d1;和 Namelist d2(d1);一样调用的是拷贝构造函数. * * * * * * 四、操作符重载 重载指的是相同的名称或符号具有不同的意义。例如:函数重载。 操作符重载就是将程序设计语言本身提供操作符的功能进行重新定义,使该操作符运用于内部基本数据类型的语义和语法同样运用于类对象等用户自定义类型。 既通过编写一些比较特殊的函数来重新定义(重载)这些操作符。 * 1.基本操作符重载 可以被重载的

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档