版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 类和简单对象,概述 类定义 对象的定义 对象的初始化 成员函数的特性 静态成员 友员 对象的生存期,5.1 概述,前面介绍的程序设计方法是把描述某一事务的数据与对数据进行操作的函数分开这种方法的缺陷是:当描述事务的数据结构发生变化时,处理这些数据结构的函数必须重新设计和调试,而再调试函数时,又有可能修改了不应修改的数据。编写大的程序时,这给调试程序和程序的维护都带来很大的问题。由于把函数与要处理的数据分开,对数据结构和函数的任何不适当的修改都可能导致整个程序不能正确执行。,如: int a(5), b(7); int c=add(a,b); coutcendl; int add(int
2、 a,int b) return a+b; ,为了克服以上的缺点,采用OOP程序设计方法,OOP的基本要求是将描述某一事物的数据与所有处理这些数据的函数都封装成一个整体,只有通过这一整体中的函数才能修改这一封装载一起的数据。这种将数据与处理这些数据的函数封装成一个整体,就构成一个类。,Class Add public: void setab(int x,int y) a=x; b=y; int add() return a+b; private: int a, b; ; void main() Add p; p.setab(3,5) int c=p.add(); coutcendl; ,cla
3、ss Rec public: void setab(int x,int y) a=x; b=y; double area() return A=a*b; double per() return P=2*(a+b); private: int a, b,P,A; ; void main() Rec p; p.setab(3,5) double a =p. area(); coutaendl; double p =p. per(); coutpendl; ,类中的数据在类的外部是不可见的,外部只能通过公共接口(类中的函数)与类中的数据发生联系,从而可以显著提高程序模块的独立性和可维护性。,类是一种
4、数据类型,是对事物抽象描述,类在程序运行中,被用作样板来建立对象。对象是类的实例,一个对象占用计算机内存中的一个区域;对象之间保持相对独立。即实现了对象的封装性,5.2 类定义,格式: class public : protected : private : ;,class TDate public: void SetDate( int y,int m,int d); int IsleapYear(); void Print( ); private: int year,month,day; ;,Ex: 定义一个日期类 /说明部分:,/实现部分: void Tdate : SetDate(int
5、 y,int m,int d) year=y; month=m; day=d; Int Tdate : IsleapYear() return (year%4=0 ,: 作用域运算符,标识成员函数属于哪个类。,在类中定义成员函数: class TDate public: void SetDate(int y,int m,int d) year=y; month=m;day=d; int IsleapYear() return (year%4=0 ,注:不能对普通数据成员初始化。类中的任何成员不能用 auto,extern和register存储类说明符进行修饰,5.3 对象的定义,一个类的普通成
6、员数据,在不同的对象中占用不同的空间;但成员函数不管在哪个实例中调用,都占用同一空间。,类的使用: void main( ) TDate date1, date2,*p,date5; p= 通过成员函数给对象的成员数据赋值。,L5_1.dsw,class Tpoint public: void Setpoint(int x,int y) X=x; Y=y; int Xcoord() return X; int Ycoord() return Y; void Move(int,int); private: int X,Y; ; Void Tpoint : Move (int setx,int s
7、ety) X+= setx;Y+= sety;,例: 定义一个描述二维平面上坐标的类,l5_2.dsw,注:形参变量不能与成员变量重名,若重名只是把形参的值赋给了形参变量,而不会赋值给成员变量。,5.4 .1 构造函数 可用一特殊成员函数(构造函数)给对象初始化,每当创建对象时系统自动调用此函数、名字与类名相同、无类型(无需void)、公有成员函数、 可以重载。,5.4 对象的初始化,int a(7); TDate date(1998,4,5) ?,class TDate private: int year, month,day; public: TDate(int y,int m,int d
8、) year=y; month=m; day=d; void Print() coutyearmonthdayendl; ;,void main( ) TDate T(2000,5,9); T.Print(); ,说明P144,1、说明 声明了一个Tdate对象T 2、实例化 为T分配空间 3、初始化 调用构造函数,5.4.2 析构函数 名字与类名相同(类名前加),无参数,不能重载,无类型(无需void)、公有成员函数.对象生命期结束时系统自动调用,class TDate private: int year, month,day; public: TDate(int y,int m,int d
9、) year=y; month=m; day=d; TDate() cout“Destructor “end; void Print() coutyearmonth day endl; ;,void main( ) TDate t (2000,5,9); t.Print(); ,L5_3.dsw ,class TDate private: int year, month,day; public: TDate(int y,int m,int d) year=y; month=m; day=d; cout“constructor”endl; TDate() cout“Destructor “end
10、; void Print() coutyearmonth day endl; ;,void main( ) TDate t1(2000,5,9); TDate t2 (2005,5,9); t1.Print(); t2. Print(); ,5.4.3 缺省构造函数和缺省析构函数,class TDate private: int year, month,day; public: void Print() coutyearmonthdayendl; ;,void main( ) TDate today; today .Print(); ,缺省构造函数: 类名:类名() 说明: 1编译器缺省的构造
11、函数并不对所产生对象的数据成员赋初值,即对象的数据成员的值是不确定的。 2 在定义类时,若定义了类的构造函数,则编译器不产生缺省的构造函数。 3 在类中,若定义了没有参数的构造函数或各参数均有缺省值的构造函数也称为缺省的构造函数,缺省的构造函数只能有一个。 4 要对对象的数据成员进行初始化时,必须定义构造函数。,B5_1,圆柱体.cpp,缺省析构函数 类名:类名() 在撤消对象时,若不做任何结束工作,可以不显式地定义析构函数。 例: 1、编写一个程序,采用一个类求矩形的面积与周长。 2、编写一个程序,采用一个类求圆柱体的体积。 3、一维数组元素之和。,5.4.4 拷贝构造函数 Int a(8)
12、; int b=a; int c(b),d; TPoint P1(5,7) ; TPoint P2(P1),p3=p2; 格式: 类名:类名(类名 调用构造函数 Tpoint c=b;或c(b); 调用拷贝构造函数 a=b; 通过类型转换赋值 a=Tpoint(100,400);,a=8; 构造函数只有一个形参时,5.5 成员函数的特性 5.5.1 内联函数和外联函数 内联函数 外联函数,Inline Void Tdate : Print() coutyear.month.dayendl; 内联函数使用的注意事项(p108),L5_6,5.5.2 重载性 成员函数,构造函数可重载; 析构函数不
13、能重载. Ex 5.7 5.5.3 设置参数的缺省值 当成员函数,构造函数的形参有默认值时实参的个数可小于形参 5.6 静态成员 5.6.1 静态数据成员 要实现同一类的不同对象之间的数据共享,可用静态数据成员. 静态数据成员定义在类体内,定义时前面加关键字static.,L5_8,Class Ttest / private: int a,b; static int c; ; int Ttest : c=500; /int Ttest : c;,特点: 1静态成员是属于类的,而不是属于某个对象的。静态成员是所有对象共享的,使用它可以节约内存。 2静态数据成员定义在类体内,初始化在类体外。初始化
14、后才可使用。,L5_10,3 定义静态数据成员像一般数据成员一样,应该给出数据类型和访问权限。 4 公有静态成员访问格式: (1)类名:静态成员名 (2)对象名. 静态成员名,b5_2,5.6.2 静态成员函数 只可以引用属于该类的静态数据成员或静态成员函数。,公有静态成员函数在程序中的调用,void main() A p(4); p.fun1(); A:fun2(p) ; ,Class A public: A(int x) a=x; void fun1()couta“,”bendl; satic void fun2(A m) coutm.aendl; coutbendl; private:
15、int a; static int b; ; int A : b=5;,p.fun2(p),Ql7_12,特点: 1 定义静态成员函数的目的是为了对类进行处理,通常是为了处理类中的静态数据成员。因此,在没有对象存在的情况下,也可调用静态成员函数。 2 由于静态成员函数是用于处理类的,因此不能使用this指针。,5.7 友员 5.7.1 友员函数 友员给予别的类或非成员函数访问私有成员权利。 在此类中用关键字friend声明;在公有或私有区说明, 定义在类体外;友员函数是普通函数不是成员函数;调用时同普通函数。 函数作为友员:,class T int data; friend void fun( T ,作业 5.13 Ex j12_1 l5_12,5.8 类的说明 先定义对象后定义类。 class A; Void main() A m; class A ;,构造函数和析构函数的调用时间:,5.8 对象的生存期 生存期: 定义对象释放对象 局部对象:定义在函数体内或块内。作用域在该体内或块内,生存期短。 静态对象:定义时用static说明符,分局部和全局。作用域不同,但生存期相同,生存期从定义起到文件结束时止。 全局对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026本科英语面试题及答案
- 2026北京社工面试题题及答案
- 2025年中国环保型电热气化加压垫市场调查研究报告
- 2025年中国火灾报警区域显示器市场调查研究报告
- 2025年中国浴缸冷热水嘴市场调查研究报告
- 2025年中国汽油电喷车喷油嘴清洗剂市场调查研究报告
- 2025年中国多路电池测量仪馈线屏市场调查研究报告
- 2026北京链家面试题及答案
- 异常分娩的护理效果评价
- 老年人长期照护康复计划制定
- 7.5 歌曲 《红河谷》课件(20张)
- 人工智能导论智慧树知到期末考试答案章节答案2024年哈尔滨工程大学
- 新大象版四年级下册科学全册知识点(精编版)
- 磨床操作培训课件
- GB/T 43189-2023核仪器仪表闪烁体和闪烁探测器的命名(标识)以及闪烁体的标准尺寸
- 预制钢筋混凝土方桩图集
- 汽车电工电子技术PPT(高职)完整全套教学课件
- 民用航空器活动区驾驶员笔试备考题库(含答案)
- 三体系管理手册
- 辣椒初加工项目可研
- GB/T 778.1-2018饮用冷水水表和热水水表第1部分:计量要求和技术要求
评论
0/150
提交评论