跟我学C++语言编程技术——运算符重载
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实例讲解
功能要求:实现复数的各种计算(相加及对它取负等运 算)。 问题的分析:
但在C++中并没有复数的数据类型定义。 为了实现复数的数据类型定义,可以通过复数类(因为类的 类型可以描述各种类型)的方式来实现。即声明出复数类。 将待运算的复数转化为复数类型的对象(OOP的将问题转化为 对象的思想)。 将复数运算的表达式转化为对象运算的表达式。 但如何能够实现将标准的运算符也能够应用于对象运算呢? 当然利用运算符重载 的方式来实现。
C++语言程序设计及编程技术
运算符重载
第五讲、运算符重载 在本单元中您能了解如下知识点:
运算符重载的实现机制 运算符种类 运算符函数
运算符重载
C++允许对原有标准的运算符给出新的运算规则的 定义(或同一运算符具有多种不同运算功能的机 制) 比如: 1+2=3 //可以的 “abc”+ “def”=“abcdef” //能够实现吗? (1+2i)+(3+4i)=(4+6i) //能够实现吗? 但这些都是我们所需要的应用要求!任何实现它们? 采用函数来实现?
运算符重载的入门知识
----正确区分*与&的不同用法
&不同用法 (1)位与 :int Z=X & Y; (2)获得变量的存储地址: int X=1; int *ptr=&X; (3)C++中的引用: int X=1; int &Xref=X;
&的不同用法您 理解了吗?
这是否体现出同一运 算符具有多种不同运 算功能的机制呢?
一元前置运算符的实现机制
++Obj1----> operator(Obj1){ 函数体 } //借助于友员运算符函数
运算符 函数不 需要带 一个 int标 识的形 参定义
++Obj1----> Obj1.operator(){ 函数体 } //借助于类运算符函数
一元后置运算符的实现机制
运算符 函数需 要带一 个int 标识的 形参定 义
运算符种类 一元运算符(一元前置): 如 +X, ++X 一元运算符(一元后置): 如 X++,X-二元运算符: 如 X+Y, X-Y, X*Y
您在C++中只需要掌握三 种类型的运算符重载的规 则
运算符函数
由关键字 operator 后跟一运算符作为函数名的函数。 如 operator +()则表示重载 + 运算符的运算符函数。 返回值类型 operator运算符(函数形参) { 函数体语句; } 如:Window &operator=(Window &win) { }
Obj1++----> operator(Obj1, int X) { 函数体 } //借助于友员运算符函数
Obj1++----> Obj1.operator(int X) { 函数体 } //借助于类运算符函数
二元运算符的实现机制 Obj1+ Obj2---->operator(Obj1, Obj2) { 函数体; } //借助于友员运算符函数
运算符重载实现的手段
借助于类运算符函数(将运算符函数设计为类中 的成员函数) 友员运算符函数(将运算符函数设计为类的友员 函数)来实现。
运算符重载实现的机制 编译系统将指定的对象运算表达式转化为对运算 符函数的调用 运算的对象将被转化为运算符函数的实参 通过函数调用从而在运算符函数体中达到特定的 运算功能的重新定义。
为什么需要运算符重载 C++中预定义了许多运算符,能够满足用户的一般 应用要求,但是其运算的对象应是基本的数据类 型,而不适用于用户自定义数据类型(如类的对 象运算),这可以使用运算符重载来实现。Fra bibliotek算符重载应用目的
可以实现同一运算符具有多种不同运算功能,如 将“+(加)”变化为“*(乘)”,但一般不实 现此规则; 另外还可以扩充运算符的运算对象数据类型(如 将“+”也适用于对象类型),这才是运算符重载 的真正目的。
Obj1+ Obj2---->Obj1.operator(Obj2){ 函数体; } //借助于类运算符函数
使用类运算符函数实现重载
此方法的本质是将运算符函数设计为类的成员函数。 因为运算符函数是成员函数,从而允许它访问类中私 有成员数据,从而方便重载的实现 定义形式:类同于一般的成员函数并且也允许为内联 函数,只是函数名有要求。 如何设计它: 函数返回值类型--->与运算结果的数据类型一致。 函数名--->以“operator 运算符”加以命名。 函数形参--->各个形参类型与运算对象的数据类型一 致(一般采用引用),形参的个数为运算对象的个 数减一。 函数体--->按照运算符在运算过程中的自然运算语义 来编程。
为了能够完成运算,应该采用一定的数据类型来表达该数据,
使用友员运算符函数实现重载 注意形参的定义与类运算符函数的不同; 由于在友员运算符函数中无this指针,因而在函 数体内必须通过对象名来访问类中的private成员 数据。
运算符重载编程的进一步说明
通过运算符重载可以扩充 C++ 中各基本类型的运算符的 功能(使其也能适用于新的数据类型如复合类型的数据 运算)。 如: Z=X+Y; ---> Obj3=Obj1 + Obj2 ; 重载后的运算符,其优先级和结合性仍保持语言中的原 始规则; 重载后的运算符运算的功能尽量保持原有含义不变,以 免误解造成运算的混乱(如不要将“+”重载为两对象相 减); 对如下运算符不能重载: . 成员分隔符, :: 作用域限定 符,?:条件运算符 重载的要求:一般将一元运算符重载为类运算符函数 (“=”也必须重载为类运算符函数,请见前面的应用 例),而将二元运算符重载为友员运算符函数(当然也 可重载为类运算符函数)。
运算符重载的入门知识
----正确区分*与&的不同用法
*的不同用法 (1)乘号: int Z=X*Y; (2)指针的定义符:int *ptr ; (3)获得指针所指向的目标单元的值: int X=1; *的不同用法您理 int *ptr =&X; 解了吗? *ptr=3; cout<<X; //此时将输出为1 还是3 ?