C++程序设计教程:第八章 类

上传人:壹****1 文档编号:570097798 上传时间:2024-08-01 格式:PPT 页数:29 大小:85.50KB
返回 下载 相关 举报
C++程序设计教程:第八章 类_第1页
第1页 / 共29页
C++程序设计教程:第八章 类_第2页
第2页 / 共29页
C++程序设计教程:第八章 类_第3页
第3页 / 共29页
C++程序设计教程:第八章 类_第4页
第4页 / 共29页
C++程序设计教程:第八章 类_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《C++程序设计教程:第八章 类》由会员分享,可在线阅读,更多相关《C++程序设计教程:第八章 类(29页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计教程(第二版)第八章第八章 类类 Chapter 8 Class 苏州大学计算机科学与技术学院苏州大学计算机科学与技术学院8/1/20241n类类 类是一种可以作为交易的概念代码类是自定义的数据类型类与应用程序不同,类的功能虽然独立,但不能独立启动,就象汽车零件那样.n类机制类机制 要通过编程的方法来维护类的数据表达,值范围和操作并不是简单的,因为要限制一些操作只能让类自己来做,以免发生问题时,无人敢对其负责 类机制就是通过语言的规定性来实现一些技术,使类具有数据封装,信息屏蔽,多态等特征,起到数据类型的作用,而达到方便编程的目的.8/1/20242第八章内容1. 从结构到类从结构

2、到类( From Structure to Class ) 2. 成员函数成员函数 ( Member Functions ) 3. 操作符操作符 ( Operators ) 4. 再论程序结构再论程序结构 ( Program Struture Restatement )5. 屏蔽类的实现屏蔽类的实现 ( Shield Class Implementations ) 6. 静态成员静态成员 ( Static Members ) 7. 友元友元 ( Friends ) 8/1/202438.1 从结构到类从结构到类1.结构体l举例(f0801)l单纯堆积数据空间构造的类型,不含有相关操作l所有相关

3、操作都必须由使用结构体的程序员自己承担,不便于代码的移植和重用l仅是一个不完整的自定义数据类型8/1/202448.1 从结构到类从结构到类2.类l概念:不但描述数据空间,还描述其操作的自定义类型l定义方法class Dateprivate:int year,month,day;public:void setdate(int,int,int);8/1/202458.1 从结构到类从结构到类2.类l举例(f0802) l成员函数和成员变量l成员权限privatepublicProtectedl类定义的两部分:类定义本体和成员函数定义l一般情况下类的定义和应用程序为多文件结构8/1/202468.

4、1 从结构到类从结构到类2.类l对象和变量变量:由内部数据类型或衍生的结构类型所产生的实体对象: 由类产生的实体,本质上,变量也是对象,只不过粗糙一点罢了8/1/202478.1 从结构到类从结构到类3.类和结构体的比较l结构体的开放性l类的封闭和自成一体性l类的使用使得程序开发的流程分工变得极为清晰8/1/202488.2 成员函数成员函数成员函数与普通函数的区别n成员函数属于类, 成员函数定义是类设计的一部分, 其作用域是类作用域. 而普通函数一般为全局函数n成员函数的操作主体是对象,使用时通过捆绑对象来行使其职责, 而普通函数被调用时没有操作主体8/1/202498.2 成员函数成员函数

5、1.成员函数的定义方法l类内部定义l类外部定义l合理选择上述两种方法的原则l成员函数的内联性问题 成员函数可以在类内,也可以在类外定义,若在类内定义,则默认为内联函数.但编译器对内联的接受自有其原则.8/1/2024101.成员函数的定义方法class Date int year, month, day;public: void set ( int y, int m, int d ) / 默认内联 year=y; month=m; day=d; ; inline bool Date:isLeapYear ( ) / 显式内联return ! ( year%400 ) | !(year%4) &

6、 year%100;8.2 成员函数成员函数23:40:03112.访问成员函数的方式对象方式 Date d; d.set(2005,12,5); 对象指针方式 Date* dp = new Date; dp-set(2005,12,5); / delete dp;23:40:03123.常成员函数与函数的常量参数l 常成员函数 对捆绑的对象, 不允许写操作l 函数的常量参数 对传递的参数, 不允许写操作例如: bool Date:comp(const Date& a)const year = 2005; / error: 常成员函数捆绑的对象 a.year = 2003; / error:

7、常量对象 return year=b.yaer & month=a.month & day=a.day; l 常成员函数的服务对象一般是类的使用者8/1/2024134.重载成员函数l 类的成员函数允许进行重载l 重载的处理规则和以前相同l 举例(f0804)8/1/2024148.3 操作符操作符1.操作符定义的函数重载特征l操作符在类中定义的目的:方便编程和直观上的理解方便编程和直观上的理解l操作符定义就是函数定义,调用操作符就是调用函数l举例:f0805 Point Point operator+(constoperator+(const Point& a, const Point& b

8、) Point& a, const Point& b) Point s; Point s; s.set(a.xs.set(a.x + + b.xb.x, , a.ya.y + + b.yb.y);); return s; return s; Point p, q; Point p, q; p.set(3, 2); p.set(3, 2); q.set(1, 5); q.set(1, 5); Point r = p + q; / p + q Point r = p + q; / p + q 等价于等价于 operator+(poperator+(p, q), q)8/1/2024158.3 操作

9、符操作符l操作符在类中定义的作用: 让让编编译译器器理理解解人人性性化化编编程程代代码码. .从从正正确确性性上上讲讲并并不不是是必必要要的的. .例如例如,Java,Java不允许操作符重载不允许操作符重载2.操作符在类中定义的性质l不能创建新的操作符:如l个别操作符不能重载:如“:”、“.”、“?:”等,因为对这些运算符的重载会严重破坏语法规则l优先级和结合性不能改变Point Point a,b,ca,b,c; ;Point d=Point d=a+ba+b*c;*c;l操作数不能改变l专门处理对象l禁止使重载后的操作符的意义发生根本变化8/1/2024163.运算符重载时的值返回和引用

10、返回l值返回:返回临时表达式的值,例如:Point operator+(const Point& a, const Point& b) Point s; s.set(a.x+b.x, a.y+b.y); return s;l引用返回: 如果有将返回值放入参数中并需要进行连续操作的需要,便需要以引用形式返回参数。例如:ostream& operator(ostream& o, const Point& d) return o”(“d.x”,“d.y”)n”;8.3 操作符操作符8/1/2024174.增量操作符的重载l增量操作符重载时的特殊性:前后增量的形式相同但意义不同l前增量运算符分析:运算

11、后表达式结果和变量自身结果的一致,且要求进行变量本身的左值连续运算l后增量运算符分析:运算后表达式结果和变量自身结果的不一致,且不允许进行变量本身的左值连续运算l处理方法:使参数和返回值类型不同l举例:f0806l后增量运算符重载时的编译特殊处理:实参和形参个数不一致8.3 操作符操作符8/1/2024185.运算符重载的成员函数化处理l成员函数形式的操作符重载: Point Point PointPoint: : operator+(constoperator+(const Point& Point& d)constd)const Point s; Point s; s.set(x+d.xs

12、.set(x+d.x, , y+d.yy+d.y);); return s; return s; l普通函数形式的操作符重载: Point Point operator+(constoperator+(const Point& a, const Point& Point& a, const Point& b)constb)const Point s; Point s; s.set(a.x+b.xs.set(a.x+b.x, , a.y+b.ya.y+b.y);); return s; return s; 8.3 操作符操作符8/1/2024195.运算符重载的成员函数化处理l无论是成员函数形式

13、的重载还是普通函数形式的重载:p + q等价于成员操作符p.operator+(q),或者普通操作符operator(p, q) 两者必居其一.l成员函数形式的运算符重载的必要条件:某个操作数是当前类的对象l不可以成为成员函数形式重载的原因8.3 操作符操作符8/1/2024208.4 再论程序结构再论程序结构1.访问控制l成员函数一般为公有public。公有的成员函数在类的外部可以被使用,即外界可以调用成员函数l数据成员一般为私有private。私有的数据成员在外部不能被访问,即外界不能访问对象的数据分量,而只能由成员函数内部去处理l公有和私有可任意设定l访问控制public和private

14、是语言提供给程序员的功能:类的内部和外部被隔绝l类的界面(接口):类全部公有成员函数的声明8/1/2024218.4 8.4 再论程序结构再论程序结构2.类的程序结构l举例:f0809l类定义作为头文件,如:point.hl类的实现作为独立编译单元,如:point.cppl使用类的程序作为另一独立编译单元,如:f0809.cppl类的头文件和类的实现可以作为一个独立的资源提供给编程者l内联的成员函数定义一般放在头文件中头文件中必须使用头文件卫士技术8/1/2024223.类作用域和类定义作用域l类定义作用域:从类定义结束开始,到从外面包围类定义的块结束(若类定义外无包围块,则结束于文件);使用

15、类的程序员在类定义作用域下编程l类作用域:类定义内部及成员函数定义内部;实现类的程序员在类作用域下编程l举例(f0810)l类作用域中成员变量被局部变量屏蔽的现象及其理解l类作用域其实是类定义作用域的子集8.4 再论程序结构再论程序结构8/1/2024238.5 8.5 屏蔽类的实现屏蔽类的实现l使用类的应用程序只需要类定义头文件编程l实现类,也只需要类定义头文件,不需要使用类的程序细节l确定了类定义(头文件),便可以从事两方面的编程而互不干涉l类定义成功地屏蔽了类的实现,是类机制的技术体现l举例8/1/2024248.6 静态成员静态成员8.6.1 静态数据成员1.静态数据成员的需要性l类中

16、属性的共有性l使用全局变量来解决属性共有性问题的缺陷l应该属于类,但不能使用普通成员变量的形式来实现属性共有l举例:f08128/1/2024252.静态数据成员的使用l概念:属于类的全部对象所有的静态成员变量称为静态属于类的全部对象所有的静态成员变量称为静态数据成员,它对于每个类而言只有一个实体,每个对象数据成员,它对于每个类而言只有一个实体,每个对象中不再有它的副本。中不再有它的副本。l定义方法:分为声明和定义初始化两个形式l举例:f0813l合理的静态数据成员定义初始化位置类定义头文件(类定义体内部和外部):KOMain函数所在文件的的开头:KO类定义内部实现部分(即成员函数定义的位置)

17、 :OK8.6 静态成员静态成员8/1/2024268.6.2 静态成员函数l调用时,不捆绑对象,所以,不能直接操作对象和其成员,若需访问该类对象,必须以参数传递之.l静态成员函数一般设计为公有的,以访问私有静态数据成员为目的.l静态成员函数一般不能访问普通成员变量l调用方式是以类名加域操作符:后跟静态成员函数l举例:f08148.6 8.6 静态成员静态成员8/1/2024278.7 友元友元1.友元的概念l需要使用友元的原因:某些类以外的函数(如普通函数等)需要直接访问某个类的保护或私有成员l需要使用友元的目的:提高效率l友元使用的后果:破坏了类的封装特性(除特殊情况,不推荐使用)l举例(f0815):若以普通函数的身份实现,则要大量调若以普通函数的身份实现,则要大量调用成员函数去访问私有数据成员,而用友元之后,可以用成员函数去访问私有数据成员,而用友元之后,可以直接访问之直接访问之8/1/2024282.友元的使用l举例(f0817)l友元函数使用的典型场合某普通函数需要频繁通过成员函数访问某类的私有成员变量用在无法成员化的操作符重载中:B-C)A-B-C)8.7 友元友元8/1/202429

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号