版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计(二),常宝宝 北京大学计算机科学与技术系 ,内容提要,C语言中的结构 类 定义成员函数 定义对象 为类成员指定存取权限 类与面向对象的程序设计,C语言中的结构,在C语言中,可以把由多个不同类型数据组成的复杂数据类型定义为结构。组成结构的各个分量被称作结构的成员。 一旦定义了一个结构类型,可以在程序中建立结构类型变量,并通过使用成员运算符(.)存取结构类型变量的各个成员。,struct _student char id20;/成员 char name20; int score; ;,int main() struct _student s1, s2; s1.score = 98;/
2、成员运算符 strcpy( s1.id, 10300506 ); strcpy( , 王二 ); s2.score = 88; strcpy( s1.id, 10300507 ); strcpy( , 陈清扬 ); ,类,为了支持面向对象的程序设计,C+提供了定义类的方法,类的概念和结构类似,不同之处在于类的成员不仅可以是数据,还可以是函数,分别称为类的数据成员和成员函数。 对于类中的每一个成员,C+允许指定其存取权限。 在定义了类后,可以建立类型为类的变量,类型为类的变量就是对象。定义对象的方法和定义结构类型变量的方法是类似的。 对象一旦建立,程序员也可以存取对象
3、的各个成员,但是否可以存取要受制于定义类时指定的存取权限。存取对象成员的方式和存取结构变量成员的方式类似,使用成员运算符(.)。,类,class BankAccount public:/存取权限 float deposit( float amount ) /成员函数 balance+=amount; return balance; private:/存取权限 unsigned int accountNumber;/数据成员 float balance; /数据成员 ;,BankAccount a, b; /建立了类型是BankAccount的对象a,ba.deposit( 100 ); /调用
4、对象a的成员函数,类,类的定义使用保留字 class 类的定义意味着定义数据成员定义成员函数指定成员的存取权限 定义类的基本格式class 类的名字 ;/不要忘记这个分号,定义类的数据成员,在类中定义数据成员和在C的结构中定义(数据)成员的方法相同。如:class TDate int year; int month; int day; ;,定义类的成员函数,类的成员函数定义了该类所能提供的功能。 定义成员函数的方法和普通(全局)函数类似,但不完全相同。 例子日期类TDate的对象代表一个日期,和日期有关的操作是: 初始化日期(设定日期的初值); 把日期按照指定的格式显示出来; 判断该日期的年份
5、是否闰年;,在类的内部定义成员函数,定义成员函数,有两种选择,一种是在类内定义,一种是在类外定义。 如果类的成员函数比较简单,可以选择在类中进行定义。,class TDate void Set( int m, int d, int y ) month = m; day = d; year = y; int year; int month; int day; ;,在类内定义成员函数和定义普通函数的形式完全相同。但函数要放在类定义的内部。 类的成员函数使用本类的数据成员,可直接使用,无需使用成员运算符(.)。,class TDate public: void Set( int m, int d,
6、int y ) month = m; day = d; year = y; int IsLeapYear() /判断一个年份是否闰年 return ( year%4=0 ,在类的内部定义成员函数,在类的内部定义成员函数,在类中定义的成员函数一般比较简单,编译器一般将其处理为内联函数,既使没有使用保留字 inline。 类通常放在头文件中进行定义,如果在类中进行定义成员函数,成员函数代码会泄漏。 如果在类中定义成员函数过多,类定义和成员函数定义混在一起,很不清晰,不利于程序的阅读。,在类的外部定义成员函数,C+允许在类的外部定义成员函数,这样完整的类定义分成两个部分,一部分是类定义,这一部分放在
7、头文件(H文件)中;另一部分是成员函数的定义,这部分通常放在cpp文件中。 如果在类的外部定义成员函数,此时类定义中只需定义数据成员及列出该类的成员函数原型。,/ tdate.h class TDate public: void Set( int, int, int ); int IsLeapYear(); void Print(); int year; int month; int day; ;,在类的外部定义成员函数,程序显得结构清晰,类提供什么样的功能?只要看类的定义就很清楚。如果关心这些功能是怎样实现的,再去看成员函数的定义。,在类的外部定义成员函数,在类的外部定义成员函数时,不同之处
8、在于应在成员函数名前增加作用域指示符,指明该成员函数隶属于哪个类,格式如下: 返回类型 类名:成员函数名(形式参数表) . ,int TDate:IsLeapYear() /注意类名应该加在成员函数名的前面 return ( year%4=0 ,如果没有作用域指示符,成员函数就会被编译器误以为是一个普通的函数。 为什么在类内定义成员函数时无需作用域指示符?一班有个同学叫张飞、二班也有个同学叫张飞,在类的外部定义成员函数,/tdate.cpp #include #include tdate.h“ void TDate:Set( int m, int d, int y ) month = m; d
9、ay = d; year = y; int TDate:IsLeapYear() return ( year%4 = 0 ,定义类的对象,在C+中,可以在程序中定义类的对象,就象建立结构类型的变量,例如: TDate a; /a是类TDate的对象。 在定义了该类的对象后,可以访问对象的数据成员以及调用该类对象的成员函数,这时要使用成员运算符(.),要同时指明对象名和成员名。 a.Set(9,27,2003);/调用对象的成员函数 a.Print();/调用对象的成员函数 a.year = 2004;/给对象的数据成员赋值 a.month = 11;/给对象的数据成员赋值,定义类的对象,定义某
10、类的对象意味着在内存中分配一片存储空间存储对象的各个数据成员。 调用对象的成员函数或存取对象的数据成员有可能改变对象的状态(即对象数据成员的值)。,定义类的对象,不但可以定义某类的对象,也可以定义指向某类对象的指针,此时存取对象的成员要使用指针成员运算符(-)。TDate a, *pa; pa = ,类及其客户,如果某个普通函数或另外一个类中用到了类A,该函数或类可以称为类A的客户。如:int main() TDate a; . a.Set(9,27,2003); a.Print(); . 在main函数中定义了TDate类的对象a,此时main函数就成为TDate类的客户。,类成员的存取权限
11、,然而,客户调用对象的成员函数和存取对象的数据成员是受到控制的,如果没有为类中的成员指定存取权限,则客户既不能调用其成员函数,也不能访问其数据成员。 a.Set(9,27,2003); a.Print(); a.year = 2004; a.month = 11;,类成员的存取权限,C+中定义了三种成员存取控制指示符,分别是public、protected 和 private。 在一个类中,一个存取控制指示符可以为其后面紧跟着的一组成员设定存取控制权限,形式如下:存取控制指示符: 成员1; 成员2; . 成员n;,class T private:/别忘了冒号 int m1; float m2;
12、 void func(); ,类成员的存取权限,存取权限是public的成员称为类的公共成员。客户可以存取类的所有公共成员。 存取权限是private的成员称为类的私有成员。客户不可以存取类的私有成员。 存取权限是protected的成员称为类的保护成员。客户不可以存取类的保护成员。 如果类的某个成员被指定为私有成员或保护成员,虽然类的客户不能直接存取该成员,但该类的所有成员函数均可以直接存取。 如果在类中没有指定某个成员的存取权限,则该成员是私有成员。,类成员的存取权限,year、month、day是私有成员,客户不能直接存取。 Set()、Print()、IsLeapYear()是公共成员
13、,客户可以直接存取。,/ tdate.h class TDate public: void Set( int, int, int ); int IsLeapYear(); void Print(); private: int year; int month; int day; ;,int main() TDate a; . a.Set(9,27,2003); a.Print(); a.year = 2003;/ 错误 a.month = 10; / 错误 a.day = 30; / 错误 . ,类成员的存取权限,客户可以直接存取所有成员,因为6个成员均为公共成员。,/ tdate.h clas
14、s TDate public: void Set( int, int, int ); int IsLeapYear(); void Print(); int year; int month; int day; ;,int main() TDate a; . a.Set(9,27,2003); a.Print(); a.year = 2003;/ 正确 a.month = 10; /正确 a.day = 30; /正确 . ,类成员的存取权限,类中可以出现的成员存取权限指示符数量不限,顺序不限。 类X中定义了11个成员,其中4个是私有成员,5个公共成员,2个保护成员。,class X publi
15、c: int m1; int m2; protected: int m3; int m4; public: /第二次出现了public int f1(); int f2(); int m5; private: int f3(); int m6; private: /可以这样指定,但多余 int f4(); int m7; ;,C+中的结构,C+中的结构struct和C中的struct不同,实际上C+的中的struct和class一样,在C+中,也可以为结构定义成员函数,惟一不同在于默认的存取权限,class中若没有指定成员的存取权限,则默认为private成员,而struct中没有指定成员存取权限,默认是public成员。,struct TDate void Set( int, int, int ); int IsLeapYear(); void Print(); private: int year; int month; int day; ;,类和面向对象的程序设计,类把数据和针对数据的操作(成员函数)封装在一起。因为数据和操作数据的算法是不可分的。 类中存取控制,使得类可以把类实现的细节隐
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026社团电台面试题及答案
- 易燃易爆物品管理制度
- 医院医患沟通制度
- 行政奖罚制度
- 年产180万套卫浴产品及净水组件项目可行性研究报告模板-拿地立项申报
- 2025年网格员知识试题及答案
- 2026年农艺工技师高级理论及专业技术知识试题库(附答案)
- 2025年认证基础CCAA考试试试题及答案
- 2026年制冷与空调设备运行操作作业理论考试题库及答案
- 2026年皖北卫生职业学院单招职业适应性考试测试卷附答案
- 2026年环境监测人员持证上岗考核试题上、下册附答案
- 2026年新教材人教版九年级上册英语Unit 3 Smart Learning 教案
- 成都兴城投资集团有限公司成都蓉城城市管理服务有限公司2026年6月校园招聘笔试参考试题及答案详解
- 商铺应急处置流程
- 2026贵州铜仁德江机场消防员岗招聘15人笔试备考试题及答案详解
- 2026年四上部编语文说课稿
- 《分数乘整数》数学课件
- 2026年西藏高考理科综合题考点及完整答案
- 雨课堂学堂在线学堂云《医学信息检索与利用(首都医科)》单元测试考核答案
- 分层审核检查表(一)
- 2023年福建省妇幼保健院护士招聘考试参考题库+答案
评论
0/150
提交评论