第13章运算符重载PPT讲稿.ppt
《第13章运算符重载PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第13章运算符重载PPT讲稿.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第1313章运算符重载章运算符重载第1页,共54页,编辑于2022年,星期日讲授内容讲授内容n运算符重载的概念运算符重载的概念n以成员函数的方式重载运算符以成员函数的方式重载运算符n以友元函数的方式重载运算符以友元函数的方式重载运算符n流插入和流提取运算符的重载流插入和流提取运算符的重载n一般单目和双目运算符的重载一般单目和双目运算符的重载n赋值运算符重载赋值运算符重载n类型转换运算符重载类型转换运算符重载第2页,共54页,编辑于2022年,星期日13.1 13.1 运算符重载的概念运算符重载的概念 (1/2)(1/2)n类似于函数重载类似于函数重载n把传统的运算符用于用户自定义的对象把传统
2、的运算符用于用户自定义的对象n直观自然,可以提高程序的可读性直观自然,可以提高程序的可读性n体现了体现了C+C+的可扩充性的可扩充性n通过定义名为通过定义名为operator的函的函数来实现运算符重载数来实现运算符重载第3页,共54页,编辑于2022年,星期日例例1 1:复数的、运算:复数的、运算 (1/5)(1/5)/文件文件1:complex1.h复数类的定义复数类的定义#ifndefCOMPLEX1_H#defineCOMPLEX1_HclassComplexpublic:Complex(double=0.0,double=0.0);Complexoperator+(constCompl
3、ex&)const;Complexoperator-(constComplex&)const;Complex&operator=(constComplex&);voidprint()const;private:doublereal;/realpartdoubleimaginary;/imaginarypart;#endif第4页,共54页,编辑于2022年,星期日例例1 1:复数的、运算:复数的、运算 (2/5)(2/5)/文件文件2:complex1.cpp复数类的成员函数定义复数类的成员函数定义#include#includecomplex1.hComplex:Complex(double
4、r,doublei)real=r;imaginary=i;Complex Complex:operator+(const Complex&operand2)constComplex Complex:operator+(const Complex&operand2)constComplexsum;sum.real=real+operand2.real;sum.imaginary=imaginary+operand2.imaginary;returnsum;第5页,共54页,编辑于2022年,星期日例例1 1:复数的、运算:复数的、运算 (3/5)(3/5)Complex Complex:oper
5、ator-(const Complex&operand2)constComplex Complex:operator-(const Complex&operand2)constComplexdiff;diff.real=real-operand2.real;diff.imaginary=imaginary-operand2.imaginary;returndiff;Complex&Complex:operator=(constComplex&right)real=right.real;imaginary=right.imaginary;return*this;/enablesconcatena
6、tionvoidComplex:print()constcout(real,imaginary);第6页,共54页,编辑于2022年,星期日例例1 1:复数的、运算:复数的、运算 (4/5)(4/5)/文件文件3:FIG13_1.cpp主函数定义主函数定义#include#includecomplex1.hmain()Complexx,y(4.3,8.2),z(3.3,1.1);coutx:;x.print();coutny:;y.print();coutnz:;z.print();x=y+z;coutnnx=y+z:n;第7页,共54页,编辑于2022年,星期日例例1 1:复数的、运算:复数
7、的、运算 (5/5)(5/5)x.print();cout=;y.print();cout+;z.print();x=y-z;coutnnx=y-z:n;x.print();cout=;y.print();cout-;z.print();cout =()-=的重载函数必须是类的成员函数的重载函数必须是类的成员函数第10页,共54页,编辑于2022年,星期日13.2 13.2 运算符成员函数与友元函数运算符成员函数与友元函数 (1/2)(1/2)n以成员函数的方式重载运算符以成员函数的方式重载运算符n单目运算符:不带参数,该类对象为唯一操作数单目运算符:不带参数,该类对象为唯一操作数n双目运算符
8、:带一个参数,该类对象为左操作数、双目运算符:带一个参数,该类对象为左操作数、参数为右操作数参数为右操作数n以友元函数的方式重载运算符以友元函数的方式重载运算符n单目运算符:带一个参数,该参数为唯一操作数,单目运算符:带一个参数,该参数为唯一操作数,是自定义类的对象是自定义类的对象n双目运算符:带两个参数,第一个参数为左操作数、双目运算符:带两个参数,第一个参数为左操作数、第二个参数为右操作数,至少有一个参数为自定义第二个参数为右操作数,至少有一个参数为自定义类的对象类的对象第11页,共54页,编辑于2022年,星期日13.2 13.2 运算符成员函数与友元函数运算符成员函数与友元函数 (2/
9、2)(2/2)n如果双目运算符的左操作数不是自定义类如果双目运算符的左操作数不是自定义类的对象,重载函数不能定义为成员函数的对象,重载函数不能定义为成员函数n流插入运算符流插入运算符的重载的重载n运算符可交换性的实现(两个不同类型的操作运算符可交换性的实现(两个不同类型的操作数)数)n运算符重载函数的定义要保证运算无二义运算符重载函数的定义要保证运算无二义性性第12页,共54页,编辑于2022年,星期日13.3 13.3 单目运算符重载单目运算符重载 (1/3)(1/3)n操作数是自定义类的对象或对象的引用操作数是自定义类的对象或对象的引用n作为成员函数重载作为成员函数重载n没有参数没有参数n
10、作为友元函数重载作为友元函数重载n参数为自定义类的对象或对象的引用参数为自定义类的对象或对象的引用 第13页,共54页,编辑于2022年,星期日例例2 2:定义字符串类:定义字符串类StringString,并以成员函数的方式重载并以成员函数的方式重载运算符运算符!以判断对象中的字符串是否为空串以判断对象中的字符串是否为空串(1/3)(1/3)/文件文件string.h#if!defined_STRING_H_#define_STRING_H_#includeclassStringpublic:String(char*m=);/使用默认参数的构造函数使用默认参数的构造函数String();/定
11、义运算符重载成员函数原型定义运算符重载成员函数原型booloperator!();private:char*str;#endif第14页,共54页,编辑于2022年,星期日例例2 2:定义字符串类:定义字符串类StringString,并以成员函数的方式重载并以成员函数的方式重载运算符运算符!以判断对象中的字符串是否为空串以判断对象中的字符串是否为空串(2/3)(2/3)/文件文件String.cpp#include#includestring.hString:String(char*m)str=newcharstrlen(m)+1;strcpy(str,m);String:String()d
12、eletestr;boolString:operator!()/实现运算符重载函数实现运算符重载函数if(strlen(str)=0)returntrue;returnfalse;第15页,共54页,编辑于2022年,星期日例例2 2:定义字符串类:定义字符串类StringString,并以成员函数的方式重载并以成员函数的方式重载运算符运算符!以判断对象中的字符串是否为空串以判断对象中的字符串是否为空串(3/3)(3/3)/文件文件ex13_1.cpp#include#includeString.hmain()Strings1,s2(somestring);if(!s1)/括号中等价于括号中等
13、价于s1.operator!()couts1isNULL!endl;elsecouts1isnotNULL!endl;if(!s2)couts2isNULL!endl;else couts2isnotNULL!endl;return0;第16页,共54页,编辑于2022年,星期日程序执行结果:程序执行结果:s1isNULL!s2isnotNULL!第17页,共54页,编辑于2022年,星期日例例3 3:定义字符串类:定义字符串类StringString,并以友元函数的方式重并以友元函数的方式重载运算符载运算符!以判断对象中的字符串是否为空串以判断对象中的字符串是否为空串 (1/3)(1/3)/
14、文件文件string.h#if!defined_STRING_H_#define_STRING_H_#includeclassString/定义运算符重载友元函数原型定义运算符重载友元函数原型friendbooloperator!(String&s);public:String(char*m=);String();private:char*str;#endif第18页,共54页,编辑于2022年,星期日例例3 3:定义字符串类:定义字符串类StringString,并以友元函数的方式重载并以友元函数的方式重载运算符运算符!以判断对象中的字符串是否为空串以判断对象中的字符串是否为空串(2/3)(
15、2/3)/文件文件String.cpp#include#includestring.hString:String(char*m)str=newcharstrlen(m)+1;strcpy(str,m);String:String()deletestr;booloperator!(String&s)/实现运算符重载友元函数实现运算符重载友元函数if(strlen(s.str)=0)returntrue;returnfalse;第19页,共54页,编辑于2022年,星期日例例3 3:定义字符串类:定义字符串类StringString,并以友元函数的方式重并以友元函数的方式重载运算符载运算符!以判断
16、对象中的字符串是否为空串以判断对象中的字符串是否为空串 (3/3)(3/3)/文件文件ex13_2.cpp#include#includeString.hmain()Strings1,s2(somestring);if(!s1)/括号中等价于括号中等价于operator!(s1)couts1isNULL!endl;else couts1isnotNULL!endl;if(!s2)couts2isNULL!endl;elsecouts2isnotNULL!endl;return0;第20页,共54页,编辑于2022年,星期日程序执行结果:程序执行结果:s1isNULL!s2isnotNULL!第
17、21页,共54页,编辑于2022年,星期日13.3 13.3 单目运算符重载单目运算符重载 (2/3)(2/3)n特殊的单目运算符特殊的单目运算符+、-以以+为例(为例(-同理同理),设设b b为类为类C C的对象的对象n前自增,如:前自增,如:+b+bn重载函数可为重载函数可为C C的成员函数,原型为的成员函数,原型为 C&C&operator+();operator+();n也可为也可为C C的友元函数,原型为的友元函数,原型为 C&C&operator+(C&);operator+(C&);第22页,共54页,编辑于2022年,星期日13.3 13.3 单目运算符重载单目运算符重载 (3
18、/3)(3/3)n后自增,如:后自增,如:b+b+n重载函数可为重载函数可为C C的成员函数,原型为的成员函数,原型为 C&operator+(int);C&operator+(int);b+b+转换为函数调用转换为函数调用b.operator+(0)b.operator+(0)n重载函数也可为重载函数也可为C C的友元函数,原型为的友元函数,原型为 C&operator+(C&,int);C&operator+(C&,int);b+b+转换为函数调用转换为函数调用operator+(boperator+(b,0)0)第23页,共54页,编辑于2022年,星期日13.4 13.4 重载流插入和
19、流提取运算符重载流插入和流提取运算符(1/2)(1/2)ncout+cout+可以输出预定义类型的对象可以输出预定义类型的对象如:如:coutstring;ncoutcout是类是类ostreamostream的一个对象(定义于头文的一个对象(定义于头文件件ostream.hostream.h中)中)n如何实现用如何实现用coutcout输出自定义类型的对象?输出自定义类型的对象?Strings(string);coutsendl;第24页,共54页,编辑于2022年,星期日13.4 13.4 重载流插入和流提取运算符重载流插入和流提取运算符(2/2)(2/2)n应重载为成员函数还是友元函数应
20、重载为成员函数还是友元函数?n有选择吗?有选择吗?n重载函数的返回类型应该是什么?重载函数的返回类型应该是什么?n有选择吗?有选择吗?n重载函数的参数列表应该是什么?重载函数的参数列表应该是什么?n有选择吗?有选择吗?第25页,共54页,编辑于2022年,星期日例例4 4:定义字符串类:定义字符串类StringString,并重载流插入运算符并重载流插入运算符,实现用,实现用coutcout和和cincin直接输出和输直接输出和输入类入类StringString的对象的对象(1/4)(1/4)/文件文件string.h#if!defined_STRING_H_#define_STRING_H_
21、#include#includeclassStringfriend ostream&operator(ostream&output,String&s);friend ostream&operator(istream&input,String&s);friend istream&operator(istream&input,String&s);public:String(char*m=);String();private:char*str;#endif第26页,共54页,编辑于2022年,星期日例例4 4:定义字符串类:定义字符串类StringString,并重载流插入运算符并重载流插入运算符,
22、实现用,实现用coutcout和和cincin直接输出和输入类直接输出和输入类StringString的对象的对象(2/4)(2/4)/文件文件String.cpp#include#includestring.hString:String(char*m)str=newcharstrlen(m)+1;strcpy(str,m);String:String()deletestr;第27页,共54页,编辑于2022年,星期日例例4 4:定义字符串类:定义字符串类StringString,并重载流插入运算符并重载流插入运算符,实现用,实现用coutcout和和cincin直接输出和输入直接输出和输入类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 运算 重载 PPT 讲稿
限制150内