版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第9 9章运算符重载与虚函数章运算符重载与虚函数9.1 多态性的概念及其表现形式多态性的概念及其表现形式9.2 运算符重载的规则与方式运算符重载的规则与方式9.3 几种典型运算符的重载几种典型运算符的重载9.4类型转换类型转换9.5联编与虚函数联编与虚函数9.6纯虚函数和抽象类纯虚函数和抽象类多态性的概念及其表现形式顾名思义,多态的意思是一个事物有多种形态。从程序设顾名思义,多态的意思是一个事物有多种形态。从程序设计的角度看,通常指对于同一个消息、同一种调用,在不同的计的角度看,通常指对于同一个消息、同一种调用,在不同的场合,不同的情况下,执行不同的行为。例如运算符的重载和场合,不同的情况下
2、,执行不同的行为。例如运算符的重载和虚函数。虚函数。 多态性是指发出同样的消息被不同类型的对象接收时导致多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为。完全不同的行为。 消息消息主要指对类的成员函数的调用。主要指对类的成员函数的调用。 C+ C+ 系统支持二种多态性:系统支持二种多态性:1.1.静态多态性静态多态性编译时的多态性,其具体实现主要有:编译时的多态性,其具体实现主要有:函数重载(详见函数重载(详见5.5.25.5.2,本章不再介绍)和运算符重载,本章不再介绍)和运算符重载2.2.动态多态性动态多态性运行时的多态性,其具体实现主要有:运行时的多态性,其具体实现主要有
3、:虚函数虚函数运算符重载的方法运算符重载的方法class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex complex_add(Complex &c2); void display( ); private:double real; double imag;Complex Complex complex_add(Complex &c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c; void
4、Complex display( ) cout(real,imagi)endl;int main( )Complex c1(3,4),c2(5,-10),c3; c3=plex_add(c2); coutc1=; c1.display( ); coutc2=; c2.display( ); coutc1+c2=; c3.display( ); return 0;Complex operator+(Complex c2);Complex Complex operator+(Complex c2) Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;
5、return c;* *,/,/如何实现如何实现c3=c1+c2;注注 意意H重载不能改变运算符运算对象重载不能改变运算符运算对象( (即操作数即操作数) )的个数。的个数。H重载运算符的函数不能有默认的参数重载运算符的函数不能有默认的参数H重载的运算符必须和用户定义的自定义类型的对象一重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象起使用,其参数至少应有一个是类对象. .H用于类对象的运算符一般必须重载,但有两个例外,用于类对象的运算符一般必须重载,但有两个例外,运算符运算符“=”“=”和和“&”“&”不必用户重载不必用户重载int operator +(in
6、t a,int b)int operator +(int a,int b)return(a-b);return(a-b);运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex operator+(Complex &c2);void display( ); private:double real; double imag;Complex Complex operator+(Comple
7、x &c2) Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex display( ) cout(real,imagi)endl;int main( )Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=; c1.display( ); coutc2=; c2.display( ); coutc1+c2=; c3.display( ); return 0;friend Complex operator + (Complex c1,Complex c2);Comple
8、x operator + (Complex c1,Complex c2) /定义作为友元函数的重载函数定义作为友元函数的重载函数return Complex(c1.real+c2.real, c1.imag+c2.imag);两者的区别两者的区别c3=c2+i;Complex Complex operator+(int i) return Complex(real+i,imag);c3=i+c2;friend Complex operator+(int i,Complex c);Complex operator+(int i, Complex c) return Complex(i+c.rea
9、l,c.imag);无法调用无法调用i.operator+ 运算符重载函数作为成员函数运算符重载函数作为成员函数, ,必须要求运算表达式第一个必须要求运算表达式第一个参数参数( (即运算符左侧的操作数即运算符左侧的操作数) )是一个类对象,而且与运算符函是一个类对象,而且与运算符函数的类型相同。数的类型相同。 将双目运算符重载为友元函数时,在函数的形参表列中必将双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数,不能省略,不要求第一个参数必须为类对象。须有两个参数,不能省略,不要求第一个参数必须为类对象。例例66 55 4433 22 1117 16 1514 13 1283 71
10、5947 35 23+=class Matrix public: Matrix(); friend Matrix operator+(Matrix &,Matrix &); void input(); void display(); private: int mat23; ;Matrix:Matrix() for(int i=0;i2;i+) for(int j=0;j3;j+) matij=0;Matrix operator+(Matrix &a,Matrix &b) Matrix c; for(int i=0;i2;i+) for(int j=0;j3;j+) c.matij=a.mati
11、j+b.matij; return c; void Matrix:input() for(int i=0;i2;i+) for(int j=0;jmatij;void Matrix:display() for (int i=0;i2;i+) for(int j=0;j3;j+) coutmatij ; coutendl;void main()Matrix a,b,c; a.input(); b.input();a.display();b.display(); c=a+b; c.display();华华 东东 交交 通通 大大 学学 信信 息息 工工 程程 学学 院院重载单目运算符重载单目运算符
12、重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符 用户自己定义的类型的数据,是用户自己定义的类型的数据,是不能不能直接用直接用“”来输出和输入的。来输出和输入的。 对对“”重载的函数形式如下:重载的函数形式如下: istream & operator (istream &,自定义类自定义类 &);ostream & operator ”“”的函数的第一个参数和函数的的函数的第一个参数和函数的类型都必须是类型都必须是istream&istream&类型类型; ; 只能将重载只能将重载“”“”和和“”“”的函数作为友元函数的函数作为友元函数或普通的函数,而不能将它们定义为成员函数。或普
13、通的函数,而不能将它们定义为成员函数。class Complex public:Complex( )real=0;imag=0; Complex(double r,double i) real=r;imag=i; Complex operator+(Complex &c2);friend ostream& operator (ostream&,Complex&);void display( ); private:double real; double imag;Complex Complex operator+(Complex &c2) return Complex(real+c2.real,
14、imag+c2.imag); void Complex display( ) cout (real,imagi) endl;ostream& operator (ostream& output,Complex& c) output (c.real+c.imagi) endl; return output;int main( )Complex c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;例例 coutc3c2;(coutc3)c2;coutc35endl;信息工程学院计算机应用教研室为什么运算符为什么运算符“”“”重载函数返回类型是引用重载函数返回类
15、型是引用coutc3c2;coutc3c2;相当于相当于operator (operator (cout,c3),c2)operator (operator (cout,c3),c2) 无论函数返回的是什么无论函数返回的是什么, ,它都会成为下一个运算符的左它都会成为下一个运算符的左边的参数边的参数, ,返回返回coutcout的当前值以便连续的输出的当前值以便连续的输出. .信息工程学院计算机应用教研室联编与虚函数联编与虚函数 联编也称绑定,是指源程序在编译后生成的可执行代联编也称绑定,是指源程序在编译后生成的可执行代码经过连接装配在一起的过程,即是指计算机程序自身彼码经过连接装配在一起的过
16、程,即是指计算机程序自身彼此关联的过程,此关联的过程, 按联编工作来分:按联编工作来分:1. 1. 静态联编:联编工作在编译连接阶段完成。静态联编:联编工作在编译连接阶段完成。2. 2. 动态联编:联编在程序运行阶段完成。动态联编:联编在程序运行阶段完成。虚函数引例虚函数引例#include class A public:void display()couttA:display()endl; ;class B: public A public:void display()couttB:display()endl; ;class C: public B public:void display()
17、couttC:display()display();void main()A a;B b;C c;A *p;p=&a;fun(p);p=&b;fun(p);p=&c;fun(p);运行结果:运行结果: A:display() A:display() A:display()?虚函数虚函数H H 虚函数的作用是允许在派生类中重新定义虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。或引用来访问基类和派生类中的同名函数。H H 程序中不是通过不同的对象名去调用不同程序中不是通过不同的对象名去调用不同派
18、生层次中的同名函数,而是通过指针调用派生层次中的同名函数,而是通过指针调用它们。它们。H H 虚函数是动态联编的基础虚函数是动态联编的基础, 虚函数是非静态虚函数是非静态的成员函数的成员函数#include class B0 public:virtual void display()coutB0:display()endl;class B1: public B0 public: void display() coutB1:display()endl; ;class D1: public B1 public: void display() coutD1:display()display(); v
19、oid main() B0 b0, *p; B1 b1; D1 d1; p=&b0;fun(p); p=&b1;fun(p); p=&d1;fun(p);虚函数的定义虚函数的定义virtual () 即在类的说明中,在函数原型之前加即在类的说明中,在函数原型之前加virtual。注意:注意: virtual 只用在类定义的原型说明中,不能用在函数只用在类定义的原型说明中,不能用在函数实现中。实现中。 具有继承性,基类中定义了虚函数,派生类中无论是具有继承性,基类中定义了虚函数,派生类中无论是否说明,否说明,同原型同原型函数都自动为虚函数。函数都自动为虚函数。 本质:不是重载定义而是覆盖定义。本质:不是重载定义而是覆盖定义。 调用方式:通过调用方式:通过基类指针或引用基类指针或引用,执行时会根据,执行时会根据指针指针指向的对象的类指向的对象的类,决定调用哪个函数。,决定调用哪个函数。 只能用只能用virtual声明类的成员函数,使它成为虚函数,声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数而不能将类外的普通函数声明为虚函数纯虚函数与抽象类纯虚函数与抽象类H H H H H H 抽象类:不用来定义对象而只作为一种基本类型用作抽象类:不用来定义对象而只作为一种基本类型用作继承的类。继承的类。H H #include class B0 publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工地安全生产工作总结
- 媒体广告行业美工工作技能分享
- 客户需求分析总结
- 平面设计行业保安工作总结
- 七年级生物教学反思与心得体会【4篇】
- 泌尿外科护士的工作点滴
- 保险公司话务员工作总结
- 体育场保安工作总结
- 2024年度不动产交易担保合同登记与解除服务协议2篇
- 离婚协议委托书代拿
- 2019疏浚工程预算定额
- 笙的演奏技术与教学
- 大学生预征对象登记表模板
- 《明辨是非》课件
- 重症监护专科护理质控考核标准
- 2023版设备管理体系标准
- 高标准农田输配电工程施工方案与技术措施
- 外来人员车辆入厂安全须知
- 小学校本课程-寻觅沉睡的宝船教学课件设计
- 2022-2024学年校方责任保险统保方案
- 食材供应链行业市场分析ppt
评论
0/150
提交评论