第13章 运算符重载

合集下载

13.1 运算符重载

13.1 运算符重载

说明:程序中出现的表达式 c1+c2 编译程序将其解释为: c1.operator+(c2); 其中,c1和c2是complex类的对象,而operator+( )是运算符 “+”的重载函数。 同理 c1-c2 解释为: c1.operator-(c2); 因此:A行 c4+=c1+c2; 被解释为: c4.operaotr+=(c1.operaotr+(c2));
说明: ★程序中的A行调用构造函数产生一个临时对象,并返回该 临时对象的值。 我们已经知道,对于双目运算符,重载为类的成员函数时, 仅有一个参数;重载为友元函数时,有两个参数,因此,当 程序中出现: c1+c2 编译系统将其解释为 operator+(c1, c2); 这将调用如下的函数进行求值运算: complex operator+(complex &c1, complex &c2);
(4)运算符的重载实际上是函数的重载。不同之处在于系 统约定了重载运算符的函数名,operator @( ); (5)不可臆造新的运算符。必须把重载运算符限制在C++ 语言中已有的运算符范围内的允许重载的运算符之中。
2. 重载为友元函数
运算符重载函数还可以为友元函数。当重载为友元函数 时,由于友元函数不是类的成员函数,尽管它可以访问类的 所有成员(包括私有成员),但必须通过类的对象才能实现 这种访问,因此当运算符重载为友元函数时,对于双目运算, 友元函数必须有2个参数,对于单目运算符,友元函数也必须 有一个参数。 注意,有些运算符不能重载为友元函数,它们是: =,(),[ ]和->。
Complex operator +(Complex &c1, Complex &c2) { Complex t; t.Real=c1.Real+c2.Real; t.Image=c1.Image+c2.Image; return t; } Complex operator+(Complex c1, float s) { Complex t; t.Real=c1.Real+s; t.Image=c1.Image; return t; }

C++基础系列——运算符重载

C++基础系列——运算符重载

C++基础系列——运算符重载1. 运算符重载简介所谓重载,就是赋予新的含义。

函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。

同样运算符重载(Operator Overloading)可以让同⼀个运算符可以有不同的功能。

可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据也可以⾃定义运算符重载:class Complex{public:Complex();Complex(double real, double imag);Complex operator+(const Complex &a) const;void display() const;private:double m_real;double m_imag;};// ...// 实现运算符重载Complex Complex::operator+(const Complex &A) const{Complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this -> m_imag + A.m_imag;return B;// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);}int main(){Complex c1(4.3, 5.8);Complex c2(2.7, 3.7);Complex c3;c3 = c1 + c2; // 运算符重载c3.display();return 0;}运算结果7 + 9.5i运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。

第12-13讲 运算符重载

第12-13讲 运算符重载
7
7.1.2 运算符重载规则
可以重载C++中除下列运算符外的所有运算符: 类属关系运算符. 成员指针运算符* 作用域分辨符:: sizeof运算符 三目运算符?: 只能重载C++语言中已有的运算符,不可臆造新的。 不能改变操作数个数。 不能改变原运算符的优先级和结合性。 不能改变运算符对预定义类型数据的操作方式。 经重载的运算符,其操作数中至少应该有一个是自定 义类型。
14

void complex:: print()//显示输出复数 { cout<<real; if(imag>0) cout<<"+"; if(imag!=0) cout<<imag<<"i";cout<<endl; } void main() { complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;//定义6个复数类对象 A1.print(); A2.print(); A3=A1+A2; A3.print(); A4=A1-A2; A4.print(); A5=A1*A2; A5.print(); A6=A1/A2; A6.print(); }
2

class complex { public: double real,imag; //定义一个实部,一个虚部变量 complex(double r=0,double i=0) { real=r; imag=I; } }; main() { complex com1(1.1,2.2),com2(3.3,4.4),total; total=com1+com2; 错误,2个自定义的数据类 return 0; 型complex类型对象相加, } C++无法实现. 希望实现total=com1+com2;重载“+”

作业13

作业13

HZAU-专业C++作业13(运算符重载)判断题1. 所有的运算符都可以重载。

F2.在C++中,编译时的多态性是通过函数和运算符的重载实现的。

T3. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现。

T4. 运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。

T5. 运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字operator。

T6. 运算符重载后,优先级、结合性和操作数都是不变的。

T7. 重载运算符的函数也可以设置默认参数。

F8. 使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不相同的。

T9. 运算符“.”、“::” 、“?:” 不能重载T10. 运算符=、()、[]和-&gt;可作为类成员运算符, 不能作为友员运算符。

T选择题1.下列运算符中,(A )运算符在C++中不能重载。

A. ?:B. [ ]C. newD. &&2.下列运算符不能用友元函数重载的是(c)。

A. +B. =C. *D. <<3.在一个类中可以对一个操作符进行( D )重载。

A. 1种B. 2种及以下C. 3种及以下D. 多种4.友元运算符obj1>obj2被C++编译器解释为( A )。

A. operator > (obj1, obj2)B. > (obj1, obj2)C. obj2.operator > (obj1)D. obj1.operator > (obj2)5.下列关于C++运算符函数的返回类型的描述中,错误的是( C )。

A. 可以是类类型B. 可以是int类型C. 可以是void类型D. 可以是float类型6.下列关于运算符重载的描述中,正确的是( D )。

A. 运算符重载可以改变运算符的操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构7.先加一然后再使用的++运算符的重栽形式是(A)。

C++电子教案第十三章 运算符重载

C++电子教案第十三章 运算符重载
北京源智天下科技有限公司
1-7
• • • • • •
联系方式:
运算符重载为类的友元函数
• 将重载的运算符函数定义为类的友元函数,称为友元运算符 函数。友元运算符函数不是类的成员,其在类内声明原型, 在类外定义函数本身。由于友元运算符函数不是类的成员函 数,不属于任何一个类对象,所以没有this指针,因此,重 载双目运算符时要有两个参数,重载单目运算符时只要一个 参数就可以了。一般来说,友元运算符函数在类内声明的一 般形式为: friend<返回类型> operator<运算符>(参数表); 在类外定义的一般形式为: <返回类型> operator<运算符>(参数表) { 函数体 }
运算符重载简介

简单来说,运算符重载是实现编译时的多态性的另外一 种形式。运算符重载是对已有的运算符赋予多重含义, 使同一个运算符作用于不同类型的数据时,导致不同类 型的行为。
运算符重载的实质是函数重载。事实上,C++语言中的 每一个运算符对应着一个运算符函数,在实现过程中, 把指定的运算表达式中的运算符转化为对运算符函数的 调用,而表达式中的运算对象转化为运算符函数的实参, 这个过程是在编译阶段完成的。
C++中为什么要支持运算符重载,其好处如何体现? 运算符重载的规则有哪些? 运算符重载有两种形式,其分别是什么? 写一个程序测试输入的长度能否构成一个三角形。构成 三角形的条件是任意两边之和大于第三边。
北京源智天下科技有限公司
1-12
联系方式:

北京源智天下科技有限公司
1-3
联系方式:
运算符重载的特点

尽管运算符重载是一种特殊的函数重载,但相比函数重 载,运算符重载有着自身的一些特点。使用operator关 键字对重载函数进行标识和定义。运算符有 3种形式, 即中缀、后缀、前缀,它们的 operator 表示形式如表 13-1所示。

运算符重载

运算符重载

1、多态性的基本概念2、派生类对象替换基类对象3、虚函数的定义4、抽象类的定义5、宠物类的设计6、运算符重载7、日期类对象判断大小8、分数类对象运算符重载☐运算符重载指赋予运算符新的操作功能,主要用于对类的对象的操作☐运算符+意味着多少对象类型的加法呢?☐还可以定义新的对象类型加法☐运算符重载定义形式:<类型><类名>::operator<操作符>(<参数表>){函数体}☐首先定义虚数类☐虚数可以描述为:a+bi☐a与b看成实数,定义成double类型☐成员函数除了构造与析构外,还有:☐输出虚数、修改虚数、得到实部a、得到虚部b ☐相加+、判相等==#include <iostream>using namespace std;class Complex{private:double real, imag;public:Complex(double r = 0, double i = 0): real(r), imag(i){ }double Real(){return real;}double Imag(){return imag;}Complex operator +(Complex&);Complex operator +(double);bool operator ==(Complex);~Complex(){ };Complex Complex::operator +(Complex &c)// 重载运算符+,两边是虚数对象{Complex temp;temp.real = real+c.real;temp.imag = imag+c.imag;return temp;}Complex Complex::operator +(double d)// 重载运算符+,左边是虚数对象,右边是双精度数{Complex temp;temp.real = real+d;temp.imag=imag;return temp;}bool Complex::operator ==(Complex c)// 重载运算符=={if (real == c.real && imag == c.imag)return true;elseint main(){Complex c1(3,4),c2(5,6),c3;cout << "C1 = " << c1.Real() << "+j" << c1.Imag() << endl;cout << "C2 = " << c2.Real() << "+j" << c2.Imag() << endl;c3 = c1+c2;cout << "C3 = " << c3.Real() << "+j" << c3.Imag() << endl;c3 = c3+6.5;cout << "C3 + 6.5 = " << c3.Real() << "+j" << c3.Imag() << endl;if ( c1==c2 )cout<<“两个复数相等”;elsecout<<“两个复数不相等”;return 0;☐运算符++分前置运算符和后置运算符☐例如: ++Y与Y++☐前置运算符定义Complex Complex::operator ++ () {real+=1;return *this;}☐后置运算符定义Complex Complex::operator ++ (int) {real+=1;return *this;}。

运算符重载的方法

运算符重载的方法

运算符重载的方法
运算符重载是指在类中重新定义某个运算符,使其能够用于类的实例。

重载运算符可以方便地对类对象进行加、减、乘、除等基本运算,也可以定义自定义运算符,以实现类特定的功能。

运算符重载的方法如下:
1.编写运算符重载函数:将要重载的运算符的符号作为函数名,如“+”、“-”、“*”、“/”等,对于自定义运算符可以自己命名。

2.指定参数个数和类型:重载函数需要参数,这些参数有不同的类型,可以是类的成员变量或其他类型的变量。

3.重载运算符要求:
(1)操作数至少有一个是类的实例,重载函数可以定义为类的成员函数或全局函数。

(2)运算符重载不能改变原有操作数的类型或个数。

(3)运算符重载函数可以返回任何类型的值,甚至可以是类的实例。

4.使用运算符:一旦重载运算符函数定义好之后,就可以像使用普通的运算符一样使用它。

需要注意的是,运算符重载不是万能的,对于某些运算符,如“&&”、“”等,是不能够重载的。

此外,在使用运算符重载时应该避免过于复杂的实现方式,以防止代码难以理解和维护。

C 程序设计 教学课件 ppt 第13章_运算符重载

C  程序设计 教学课件 ppt 第13章_运算符重载
C++程序设计,郑莉,清华大学 13
13.2 运算符重载为成员函数
Complex Complex::operator - () { return Complex(-real, -image);
} Complex Complex::operator + (const Complex &c) {
return Complex(real + c.real, image + c.image); } int main() {
• 运算符重载为类的成员函数时,函数的参数个数 比运算符原来的操作数少一个(后置++、--除外) ,这是因为重载为类的成员函数的话,该类的对象 使用此运算符时,相当于在操作数中隐式包含了指 向对象本身的this指针,自身的数据可以直接访问 ,这样就不需要再在参数表中写一个“this”进行 传递了
▫ 重载一元运算符时,操作数由指向对象的this指针提 供,因此不需要在参数表中提供任何参数;重载二元 运算符时,参数表中的唯一参数默认为右操作数,而 将this视为左操作数
)以及流输入输出操作符(<<, >>)都可以重载
C++程序设计,郑莉,清华大学 5
13.1 运算符重载的规则
• 重载运算符必须至少有一个类类型的操作数。而 用于内置类型的运算符的定义不可以改变。不能 为任何内置类型定义新的运算符,例如不能定义 两个数组的加法运算符
▫ 例如不可以重载用于整型的加号运算符: int operator + (int, int); //以上操作违法,不可 以重载用于内置类型的运算符
C++程序设计,郑莉,清华大学 19
13.3 运算符重载为非成员函数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第13章 运算符重载
杨章伟 e-mail:yang505412@
融智技术学院
课程内容安排
• • • • • •
运算符重载简介 运算符重载的形式 特殊运算符的重载 类类型转换 小结 习题
融智技术学院
1-2
运算符重载简介
• 第12章介绍了多态的实现技术,主要包括函数的重载和虚函 数。事实上,本章介绍的运算符重载也是多态性实现的一个重 要手段。运算符重载实现的是编译时的多态,即静态多态性。 C++预定义的运算符只是对基本数据类型进行操作,而对于自 定义的数据类型比如类,却没有类似的操作。为了实现对自定 义类型的操作,就必须自己编写程序来说明某个运算符作用在 这些数据类型上时,应该完成怎样的操作,这就要引入运算符 重载的概念。 简单地说,运算符重载是实现编译时多态性的另外一种形式。 运算符重载是对已有的运算符赋予多重含义,使同一个运算符 作用于不同类型的数据时,实现不同类型的行为。
融智技术学院
1-14
融智技术学院
1-6
• • • • • •
“++”和“--”的重载
• 前面范例中介绍了“++”和“--”的重载,但运算符“++”和“-”有前置和后置两种形式。例如,表达式“a++”和表达式 “++a”是不一样的。 如果不区分前置和后置,则使用operator++()或operator--()即 可;否则,要使用operator++()或operator--()来重载前置运算 符,使用operator++(int)或operator--(int)来重载后置运算符 ,调用时,参数int被传递给值0。 【范例13-6】“++”和“--”运算符的重载。范例实现了运算符 “++”和“--”的重载,包括其前置和后置两种形式
融智技术学院
1-8
• • • • •
下标运算符“[ ]”的重载
• 下标运算符operator[]通常用来访问数组中的某个元素。 事实上,其可以看作是一个双目运算符,第一个运算符是 数组名,第二个运算符是数组下标。在类对象中,可以重 载下标运算符,用它来定义相应对象的下标运算。
【范例13-8】下标运算符“[ ]”的重载。该范例实现了下 标运算符“[ ]”的重载,重载后的下标运算符能够判断数 组的下标是否越界,如越界则给出错误信息
1-11
小结
本章主要介绍了运算符重载的相关内容。从运算符重载的定 义和特点着手,通过一个具体的范例介绍运算符重载的 优点,接着简要说明了运算符重载的规则。同时,重点 讲解了两种形式的运算符重载:运算符重载为成员函数 和运算符重载为友元函数。针对每一种重载方式,都通 过一个范例介绍了双目运算符的重载和单目运算符的重 载。此外,针对几种特殊运算符,本章通过实例讲解了 赋值运算符、下标运算符等重载的实现。最后,就C++面 向对象程序设计的基础概念和特征做了简要的概括。

融智技术学院
1-9
类类型转换
类类型是指某个对象的数据类型为类,而不是标准的数据类 型。在C++中,标准的数据类型与类类型之间的转换有三 种方法。 通过构造函数转换:通过构造函数能将标准数据类型向类类 型转换,但不能将类类型转换为标准类型。 通过类类型转换函数转换:要将类类型转换为标准数据类型 时,需要采用显式类型转换机制,定义类类型转换函数 。 通过运算符重载实现类型转换:可以实现标准类型的数据与 类对象之间的运算。
融智技术学院
1-3

运算符重载的定义
运算符重载的实质是函数重载。事实上,C++语言中的每一个运算符 对应着一个运算符函数,在实现过程中,把指定的运算表达式中 的运算符转化为对运算符函数的调用,而表达式中的运算对象转 化为运算符函数的实参,这个过程是在编译阶段完成的。例如: int a=1,b=2; a+b; 表达式“a+b”在编译前,将被解释为函数调用形式:operator+(a,b) 。其中,operator是一个关键字,它与后面的“+”共同组成了该 运算符函数的函数名。因此,可以将运算符重载看作是一种特殊 的函数重载。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }
融智技术学院
1-10
【范例13-9】运算符重载转换运算符
C++中定义一个类的类型转换函数的形式为: <类名>::operator type() { // return type类型的数据 //返回type类型的对象 } 范例在类中重载了一个类型转换函数int(),该函数实现输出 并返回类类型值
融智技术学院
融智技术学院
1-5
运算符重载的形式
• 运算符的重载形式有两种:一种是重载为类的成员函数, 一种是重载为类的友元函数。对于每一种重载形式,由于 运算符的不同,都可以将其主要分为双目运算符和单目运 算符的实现。 重载为类的成员函数 : 双目运算符重载为成员函数 单目运算符重载为成员函数 重载为类的友元函数 : 双目运算符重载为友元函数 单目运算符重载为友元函数
融智技术学院
1-12
习题
• • 1.定义计数器Counter类,对其重载运算符 +。 【解答】该试题主要考查双目运算符的重载实现。运算 符的重载可以在类中进行定义,也可以在类外进行定义 ,但在类中必须进行说明。该试题首先定义一个计数器 类,在公有成员中说明运算符的重载,在类外进行定义 。 2.对Point类重载++(自增)、--(自减)运算符。 【解答】该试题主要考查单目运算符++(自增)、--(自 减)的重载。读者需要注意,++(自增)、--(自减)均 具有前置和后置的区别,其属于特殊运算符的重载。因 此,在进行这两种运算符的重载时,需要考虑前置和后 置。该试题首先定义类Point,在类中对运算符重载函数 进行说明,在类外对重载函数进行具体定则
简单地说,实现运算符重载即编写一个函数,该函数以 “operator运算符号”为函数名,其定义了重载的运算符 将要执行的操作。此外,函数的形参类型必须是自定义的类 型。当使用该运算符对形参规定的数据类型进行运算时,就 执行函数体中的操作,而覆盖了原运算符的功能。 C++中的运算符除了几个不能重载外,其他的都能重载,而且 只能重载已有的运算符,不能自己另编。 重载以后运算符的优先级和结合性都不能改变,语法结构也不 能改变,即单目运算符只能重载为单目运算符,多目运算符 只能重载为多目运算符。 运算符重载以后的功能应与原有功能类似,含义必须清楚,不 能有二义性。
• •
融智技术学院
1-13
习题
4.设计一个程序,重载四则运算符,实现复数的算术运算 。 【解答】该试题主要考查算术运算符的重载。复数由实部和 虚部构造,因此可以定义一个复数类,然后再在类中重 载复数四则运算的运算符。具体的说,可以定义类 complex,其中将四则运算符“+”、“-”、“×”和“/” 都重载为类的成员函数,重载后的四则运算符能够实现 复数的四则运算。同时声明一个友元函数用于输出运算 结果。在主函数main()中创建三个对象,其中两个对象 进行四则运算。


融智技术学院
1-7
赋值运算符“=”的重载
• 除了前面讲解的算术运算符可以进行重载外,许多其他 类型的运算符也可以进行重载,赋值运算符“=”也是如 此。在进行赋值运算符“=”重载的应用前,读者应先了 解赋值运算符“=”在实际程序中的运行情况。事实上, 对于任何一个类,如果没有用户自定义的赋值运算符函 数,系统会自动地为其生成一个默认的赋值运算符函数 ,以完成数据成员之间的复制。例如,下面的程序段: X & X::operator=(const X &source) { //类对象成员之间的赋值语句 } 一旦类X的两个对象ob1和ob2已创建,就可用 ob1=ob2进行赋值了。
相关文档
最新文档