版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CC+ 程序设计256 多态性 polymorphismOOP 四大特点:抽象、封装、继承、多态 多态性:一个接口函数名 有多种实现(多义性) 消除多义性:在编译或运行时绑定确定为一对一关系 多态性分类 绑定角度 静态多态性 编译时绑定binding编译时多态性 函数重载,操作符重载 函数模板,类模板 静态类型转换 动态多态性 运行时绑定binding运行时多态性 动态类型转换 虚函数virtual function 真正的多态性356operator:操作符或运算符 重载Overloading一名多用:一个名字,多种功用 函数重载:同名函数有多种实现 完成多种功能 作用与应用 作用:赋予操作
2、符新的功能+:不重载只能操作基本数据类型+:重载可实现 string对象的连接 操作符已有的功能,不足以满足所有要求+:不能操作复数、日期、时间、数组. 哪些操作符可以被重载系统已有的操作符大部分,不能自己发明456 禁止重载的操作符 成员访问操作符,如:obj.length() 成员指针访问操作符,如:obj.*pt 域限定操作符,如:obj:fun() 条件操作符,如:xy ? x : y 操作符重载的实质函数重载:操作符函数重载例如 Complex 对象的加法:重载 +函数Complex operator + (Complex &c2); / 函数声明 返回值 函数名 ( 形参表 );
3、. . .* *: :sizeofsizeof? :? :556 操作符函数的形参限制至少有一个形参是对象或对象引用更好 目的:保证重载操作符用于自定义类型 防止你修改操作符的原功能例如:int operator + (int a, int b) / ERROR return (a - b); / 试图修改 + 原功能 重载方式类的成员函数类的友元函数独立函数(普通函数)罕见:类的数据一般为私有656c3 = Complex(1,1) + c1; / OK?c3 = 2 + c1; / OK?c3 = c1+ 2 ; / OK?c3 += c1; / OK?创建无名对象STL常用手段756 重
4、载不能改变操作符的操作数个数,例如: 和 双目操作符需两个操作数,重载后仍是双目操作符 重载不能改变操作符的优先级,例如: * 和 / 优先级高于 + 和 - 重载不能改变运算符的结合性 操作符重载函数的形参不能有缺省值否则,改变了参数个数操作数 重载操作符的功能应与原功能相近,例如:+ 重载为 string 对象连接,便于理解 重载赋值操作符 = 对象赋值时非初始化,拷贝构造函数不被调用 重载= 实现:深拷贝(类中有指针型成员)856 重载方式选择友元破坏类的封装性,尽量重载为成员函数。通常做法: 双目二元操作符:重载为友元函数上例二元操作符+重载为成员函数:this指针指明了一个操作数,重
5、载+函数的形参个数比需要的操作数少一个 不直观重载为友元函数:操作数个数 = 形参个数 单目一元操作符:重载为成员函数单目操作符重载为成员函数,不需要参数特殊规定赋值、下标、函数操作符必须重载为成员函数流、类型转换符不能重载为成员函数回顾956操作数是数值怎么办1056创建临时无名对象常用于表达式计算1156系统用 int 来区分前置后置1256 类型转换构造函数表达式常用情况 需要对象时:数值 对象例如:Complex(6) 数值6 无名对象 类型转换函数可用成员函数如get系列得到成员,然后转换稍麻烦表达式常用情况 需要数值时:对象 一个数值 类型名重载而非操作符重载,形式上类似 定义类型
6、转换函数operator 类型名( ) /类型函数,无参数无返回值例如:operator double( ) return real; 只能重载为成员函数转换的是本类对象根据表达式推测1356需要对象的一个数值时返回虚部的整型数值给对象赋值必须给缺省值14561556没有释放观察结果,分析程序:有何问题?1656 重载目的 自定义类型的数据不能直接用 如: 数组、结构体、类 重载:输入、输出自定义类型数据 重载定义istream& operator (istream& 流对象名, 自定义类型& );ostream& operator (ostream& 流对象名, const 自定义类型& )
7、;返回值和第一个参数必须是流对象的引用流对象不可复制第二个参数也是引用避免创建临时无名对象,const 便于输出常量 重载形式禁止重载为成员函数 重载举例1756引用流对象 右边操作数左边操作数 建议重载为成员函数 一元操作符+=, *=, .等复合赋值,+,-,* 指针访问单目 必须重载为非成员函数流操作符 和 建议重载为非成员函数 二元操作符条件操作符,算术操作符,关系操作符,位操作符1956 静态多态性 模板 函数模板回顾CC+是强类型语言,虽然函数包括类功能相似或相同,但对于不同的数据类型,需要编写多个 增加编程量和源程序长度 解决方案编写一个函数模子,用这个模子翻刻出若干功能相同,参
8、数类型包括返回类型不尽相同的一批函数 模板函数 实例template void Swap(T1& a,T2& b) T1 tmp = a ; a = T1(b); b = T2(tmp); 调用: int x=5; char y=c; Swap(x, y); 回顾T1、T2适用于多种数据类型泛型技术声明泛类型2056 类模板 参数化的类:类型参数化 像函数模板一样,类模板是刻印具体类实例化的模子把成员类型、参数类型、返回类型声明为泛类型 参数化优势:能适用于广泛的数据类型 定义template / 声明泛类型T1,T2, . class 类名 / 定义类 . / 类体:使用泛类型T1, T2,
9、 . ; 类模板的声明:template class 类名 ;2156 类模板:栈const int n =10;template / T 泛型class Stack / 定义类模板 T an; / 数组元素:类型为泛型 int top; / 栈顶位置:入栈 top+ ; 出栈 top-public: Stack() top = -1; / 构造函数,初始化栈顶 void push(T elem); / 入栈函数:元素入栈 T pop(void); / 出栈函数:返回出栈元素; / 下页,实现 push 和 pop a0an-1要求数组元素类型可以改变后进先出a1new T n;2256tem
10、platevoid Stack: push(T elem) if( top = n-1 ) cout栈满; return; a+top = elem; template T Stack: pop(void) if( top0 ) cout栈空; return 0; return atop- ;观察:函数头与普通成员函数有何差别?2356 类模板实例化 确定泛类型类名 对象名;2456 全局类型与模板类型重名typedef double type ; / 全局类型名template / 局部类型名class A type n; / n 是什么类型? ;局部优先n 不是 double 类型,是泛类
11、型2556 模板类型参数可有缺省类型 左右回顾:函数参数带缺省值templateclass A T1 m1; T2 m2; ; 又例templateclass X; templateclass Y; 实例化: X a; Y b;A a(abc); / 缺省实例化A b; / 1个实参A c; / 2个实参不要混淆:类型实例化与变量初始化2656 类模板组合 内嵌对象(其他类模板的)template / U是局部类型class A A *p ; / 本类可省略不写。错:A *p;template / U是局部类型class B A &a, *b; / 不可省略,内嵌对象其他模板类的 / 如果省略
12、,不知道此时模板 A 的实际类型可变的各是各的,无关2756不能省略A 可否? 实验分析2856 模板特化 特殊的实例化 特化:特殊的实例化 对某种数据类型,不能正确实例化生成具体函数或类,对此,设计特殊的实例化:函数模板类模板特化 完全特化(全特化)对模板的全部类型进行特化 部分特化(偏特化)对模板的部分类型进行特化295630563156 部分特化例template class vector / / ;template / 部分特化:还有泛类型 Tclass vector / 第一个参数为具体类型 bool / 第二个参数 T 没有具体化 / /;这是两个类吗?3256 派生类与基类之类型
13、兼容回顾公有派生类对象可代替基类对象使用,反过来不行 作用:需要基类对象指针和引用时,用派生类的替代 好处:不必创建基类对象,提高时空和开发效率 限制:只能访问基类成员,不能访问派生类成员 改进:让它能够访问派生类成员 虚函数 虚函数 作用:无论指针引用位于类族哪层,均可调用各层成员函数指向它赋值就调用它 动态多态性指针动态变化 好处:预计某些函数将在派生类中不断改进多次派生,应在基类中把它们声明为虚函数:用基类指针指向它们即可调用其最新版,不用修改其他代码工作量大ABCD类族3356必须在类中,不能在类外/ 重写虚函数:函数首部要完全相同下例3456函数首部相同新增的虚函数3556 stat
14、ic 成员函数不能声明为虚函数 虚函数的形参缺省值如果基类虚函数形参有缺省值,派生类同名虚函数不要改变这些形参缺省值编译时确定的 虚函数与构造析构函数构造函数不能声明为虚函数,析构函数可以如果基类构造函数调用虚函数,调用的是基类虚函数,而非派生类的同名虚函数派生对象尚未创建如果基类析构函数调用虚函数,调用的是基类虚函数,而非派生类的虚函数派生类已析构完成如果基类析构函数为虚函数,所有派生类析构函数自动成为虚函数3656派生类实验观察:构造和析构函数调用谁的虚函数3756有问题观察结果构造和析构函数都调本类虚函数 虚析构函数强烈建议保证在各类层上释放对象时,调用正确的析构函数。因此,即使基类不需
15、要析构,也写一个虚析构好!3856 纯虚函数例如:virtual int GetX(void) = 0;l 只有在类中声明,且没有函数体没有实现 派生类根据需要去实现它同名覆盖 虚函数:有函数体即使空函数 抽象类Abstract Base Class 有纯虚函数的类 抽象类 抽象类不能创建定义对象实例化,纯虚函数没有实现(没定义) 只有派生类不再有纯虚函数,该派生类才非抽象类 抽象类的用途纯虚函数的用途不能创建对象的类,要之何用?标识而已3956 纯虚函数的作用 预留函数名占位置 为后继公有派生类族的对外接口public函数 统一名称 各公有派生类按需实现它编写代码 功能相近,名字相同 抽象派
16、生类派生类中仍有纯虚函数(继承的、新增的),仍为抽象类 非抽象派生类派生类中的纯虚函数已全部实现编写函数代码,成为具体类,可以用它创建对象了 抽象类举例4056ShapePointCircle设计类族抽象具体4156设计:几何图形的类族结构思考:它们彼此有什么关系4256ShapePointCircleCylinderShapePointCircleCylinderShapePointCircleCylinderShapePointCircleCylinder类层次结构图:多种方案还可以细分为一维、二维、三维图形等4356ShapePointCircleCylinder4456ShapePoi
17、ntCircleCylinder 为什么没有重写求面积、体积的函数? 如果指针指向本类对象,调用怎么办?4556ShapePointCircleCylinder4656ShapePointCircleCylinder4756可以定义抽象类指针非虚函数4856怎么输出的点坐标和半径为什么不一样说明理由4956 C+ 强制类型转换操作符 4个,介绍2个static_castdynamic_castreinterdivt_castconst_castl static_cast:运行时不检查类型安全性,不保证安全程序员保证l dynamic_cast:执行该检查。对不明确的指针 dynamic_cas
18、t 转换会失败为保证安全,static_cast 转换的结果有危险自己保证安全dynamic_cast 限制:只适用于类族指针或引用且需多态性类型 static_cast 静态转换static_cast (expression) ( ) 不能省略 类型名 表达式例如:char ch ; int x=9 ; / x cch = static_cast(x) ; / 你保证安全性精度特性5056 主要用法基本数据类型转换:上例 int char 安全性自己保证限制:不能做无关继承类型包括基本类型 指针或引用转换 比C-转换安全 如:禁止 char* int* 转换任何类型 void 类型dynamic_cast 只适合类族指针或引用,且需多态性类型替代C-基本类型转换51565256 主要用法类族中右图 基类和子类的指针引用转换移
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度粮油食品检验人员题库试题(精练)附答案详解
- 2024-2025学年度一级建造师考试彩蛋押题及参考答案详解(研优卷)
- 2024-2025学年度中医执业医师考前冲刺测试卷【必考】附答案详解
- 2024-2025学年度文化教育职业技能鉴定综合提升测试卷及完整答案详解(有一套)
- 2024-2025学年度医疗卫生系统人员能力提升B卷题库(夺分金卷)附答案详解
- 2026中国移动招聘真题及答案
- 防尘设备-施工方案(3篇)
- 吊车文明施工方案(3篇)
- 2024-2025学年度一级建造师考试彩蛋押题及参考答案详解【考试直接用】
- 2026年阳泉师范高等专科学校单招职业适应性测试题库及参考答案详解1套
- 高压设备停送电课件
- GJB1442A-2019检验工作要求
- 2025年互联网营销技能竞赛题库
- 小学生厌学心理健康分析与应对策略
- 直升机低空旅游服务行业深度调研及发展项目商业计划书
- 2025年四川省凉山州中考数学试题卷(含答案解析)
- 初中命题培训课件
- 乡镇平台公司管理制度
- 2025年南充市中考语文试卷真题(含标准答案解析)
- 国家中医药管理局《中医药事业发展“十五五”规划》全文
- 机场地勤笔试试题及答案
评论
0/150
提交评论