版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章运算符重载,目 录,91 运算符重载概述 93 双目运算符重载 94 比较运算符重载 95 赋值运算符重载,问题引入:,#include class Complex public: Complex() real=0.0; imag=0.0; Complex(double r, double i) real=r; imag=i; void display() coutreal“+”image“i”endl; private: double real; double imag; ,Complex a(10,20),b(5,8),c; c=a+b?,91 运算符重载概述,c+中预定义的运算符的
2、操作对象只能是基本数据类型 很多用户自定义类型(比如类),也需要有类似的运算操作,这就提出了对运算符进行重新定义,赋予已有符号以新功能的要求。 运算符重载是对已有的运算符赋予多重含义,同一个运算符作用于不同类型的数据导致不同类型的行为。,返回目录,运算符重载的实质就是函数重载。,91 运算符重载概述,表9.1 C+中可以重载的运算符,表92 C+中不能重载的运算符,返回目录,91 运算符重载概述,运算符重载的规则如下: C+中的运算符除了少数几个之外,全部可以重载,而且只能重载已有的这些运算符。 重载之后运算符的优先级和结合性都不会改变。 重载不能改变原运算符的操作对象个数,同时至少要有一个操
3、作对象是自定义类型。 一般来讲,重载的功能应当与原有功能相类似。,返回目录,91 运算符重载概述,friend 函数类型 operator 运算符(形参表) 当重载为类的友元函数时,参数个数与原运算数的个数相同。 函数类型 operator 运算符(形参表) 当运算符重载为类的成员函数时,函数的参数个数比原来的运算数个数要少一个(后缀+、-除外);,运算符的重载形式有两种: 重载为类的友元函数 重载为类的成员函数,返回目录,91 运算符重载概述,#include class Complex public: Complex() real=0.0; imag=0.0; Complex(double
4、 r=0.0, double i=0.0) real=r; imag=i; void display() coutreal“+”image“i”endl; Complex operator+ (const complex ,91 运算符重载概述,在编译执行过程中,首先把指定的表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数。,Complex a(2,3),b(4,5),c; c=a+b; c=operator+(a,b); c=a.operator+(b);,双目运算符 + - * / % = . 可重载为: 成员函数:非静态,一个参数 非
5、成员函数:两个参数 单目运算符 + + - - !- *. 可重载为: 成员函数: 非静态,没有参数 非成员函数:一个参数的 一些必须重载为类的成员函数的运算符 ( ), , -,= 只能重载为非成员函数的情况: 你自定义的类是第二个操作数,91 运算符重载概述(完),返回目录,最好这样做,93 双目运算符重载,双目运算符重载为类的成员函数,返回目录,oprd1 B oprd2,class Complex public: Complex() real=0.0; imag=0.0; Complex(double r, double i) real=r; imag=i; void display(
6、) coutreal+imagiendl; Complex operator + (const Complex ,93 双目运算符重载,返回目录,Complex Complex:operator + (const Complex ,对象本身是左操作数,右操作数为参数,93 双目运算符重载,void main() Complex v1(6,8),v2(3,6),v3,v4; cout v1=;v1.display(); cout v2=;v2.display(); v3=v1+v2; /v3=v1.operator+(v2); cout v1+v2=;v3.display(); v4=v1-v2
7、; /v4=v1.operator-(v2); cout v1-v2=;v4.display(); ,返回目录,93 双目运算符重载,双目运算符重载为类的友元函数,返回目录,class Complex public: Complex() real=0.0; imag=0.0; Complex(double r, double i) real=r; imag=i; void display() coutreal+imagiendl; private: double real; double imag; friend Complex operator+(const Complex ,93 双目运算
8、符重载,Complex operator + (const Complex ,返回目录,第一个参数为左操作数,第二个参数为右操作数,93 双目运算符重载(完),void main() Complex v1(6,8),v2(3,6),v3,v4; cout v1=;v1.display(); cout v2=;v2.display(); v3=v1+v2; /v3=operator+(v1,v2); cout v1+v2=; v3.display(); v4=v1-v2; /v4=operator+(v1,v2); cout v1-v2=; v4.display(); ,返回目录,94 比较运算
9、符重载,也可以设计比较运算符(如、或=)的重载函数。 比较运算符重载函数必须返回真(true/非0)或假(false/0)。,返回目录,class Complex public: Complex() real=0.0; imag=0.0; Complex(double r, double i) real=r; imag=i; void display() coutreal+imagiendl; Complex operator+(const Complex ,94 比较运算符重载,bool Complex :operator =(const Complex ,return !(*this= =
10、s1);,94 比较运算符重载(完),void main() Complex a(3,4),b(5,6),c(8,10); if( (a+b)=c) cout“相等!”endl; else cout“不等”endl; ,( a.operator+(b) ) .operator= =(c),95 赋值运算符重载,在C+中有两种类型的赋值运算符: 、. 适于实现为类的成员函数,返回目录,951 运算符“=”的重载,赋值运算符“=”的原有含义是将赋值号右边表达式的结果拷贝给赋值号左边的变量。 为了保证同类对象之间能够进行赋值操作,每个类应定义赋值操作(重载运算符)。 如果程序中没有定义赋值操作,则c
11、编译器自动生成,实现将赋值号右边对象的数据成员依次拷贝到赋值号左边对象的数据成员中。,class Complex public: Complex() real=0.0; imag=0.0; Complex(double r, double i) real=r; imag=i; Complex(const Complex ,void main() Complex a(2,3); Complex b=a; Complex c,d; d=c=a; ,952 运算符“+=”和“-=”的重载,对于标准数据类型, “+=”和“-=”的作用是将一个数据与另一个数据进行加法或减法运算后再将结果回送给赋值号左边
12、的变量中。 a+=b a=a+b,class Complex public: Complex() real=0.0; imag=0.0; Complex(double r=0.0, double i=0.0) real=r; imag=i; Complex(const Complex ,Complex ,void main () complex s1(3,4),s2(5,6),s3; s3+=s1; s3-=s1; ,这两个成员函数必须有,若没有,系统自动为类创建,提供缺省实现。 什么时候不使用使用缺省实现? 不需要拷贝所有的数据成员。 要做其他的事情。 数据成员中有指针类型时(默认的实现的是
13、浅拷贝,浅拷贝会带来安全上的隐患),探讨:拷贝构造函数和=运算符重载函数,浅拷贝带来的悬挂指针问题,class M public: M(int i); M(); void print(); private: int *p; ; M:M(int i) p = new int(i); M:M() delete p; ,编译器自动生成: M:M(const M ,浅拷贝带来的悬挂指针问题,自己定义(深拷贝) M:M(const M ,编译器自动生成: M:M(const M ,例:用char*表示姓名,class Student int no; int grade; char *name; Stud
14、ent()name=NULL; Student(int n,int g,char * na) no=n; grade=g; name=new charstrlen(na)+1; strcpy(name,na); Student()delete name; ,必须自己写 拷贝构造函数 和=,自动生成 Student(const Student ,自动生成 Student ,例:定义一个整型数组类,class Array private: int *ptr; int size; public: Array(int arraySize=10); Array(int ,int ); Array(con
15、st Array,能创建特定大小的数组 能用一个系统数组初始化你的数组 能用同类型的其他数组初始化你的数组 两个数组可以互相赋值,Array:Array(int arraySize) size=arraySize; ptr=new int size; for(int i=0;isize;i+) ptri=0; Array:Array(int a ,int s) size=s; ptr=new intsize; for(int i=0;isize;i+) ptri=ai; ,Array:Array(const Array ,92 单目运算符重载,“+”、“-”运算符有前缀和后缀两种使用形式 重载
16、运算符也有前缀和后缀两种运算符重载形式 以“+”重载运算符为例,其语法格式如下:,返回目录,函数类型 operator +( ); /前缀运算 函数类型 operator +(int); /后缀运算,使用前缀运算符的语法格式如下: +对象; 使用后缀运算符的语法格式如下: 对象+;,例9.1,9.2,#include class Sample public: Sample(int i) :n(i) void operator +( ) n+=1; /前缀运算符 void operator +(int) n+=2; /后缀运算符 void display()cout n= n endl; private: int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安全保护培训内容重点
- 中北大学《口腔解剖生理学》2025-2026学年期末试卷
- 邢台应用技术职业学院《病理学》2025-2026学年期末试卷
- 盐城工学院《大学写作训练》2025-2026学年期末试卷
- 中北大学《金融信托与租赁》2025-2026学年期末试卷
- 长治幼儿师范高等专科学校《组织行为学》2025-2026学年期末试卷
- 长春医学高等专科学校《中国传统文化之传统节日》2025-2026学年期末试卷
- 宣化科技职业学院《文化遗产概论》2025-2026学年期末试卷
- 中国医科大学《旅游资源管理》2025-2026学年期末试卷
- 扬州大学广陵学院《细胞遗传学》2025-2026学年期末试卷
- 内科诊所规章制度范本
- DB32/T 3563-2019装配式钢混组合桥梁设计规范
- 松下机器人培训
- 从严从实抓好管酒治酒 确保队伍内部长治酒安
- 新22J01 工程做法图集
- 人教版高中地理必修二知识点高考复习大纲
- 2024建筑安全员《C证》考试题库及答案
- DB64T 2035-2024高标准梯田建设技术规范
- 《十万个为什么》(米伊林)分享课课件
- 肛肠病术后并发症
- 教师书香个人读书先进事迹材料
评论
0/150
提交评论