c++类的建立及应用

上传人:第*** 文档编号:53935225 上传时间:2018-09-06 格式:PPT 页数:71 大小:377KB
返回 下载 相关 举报
c++类的建立及应用_第1页
第1页 / 共71页
c++类的建立及应用_第2页
第2页 / 共71页
c++类的建立及应用_第3页
第3页 / 共71页
c++类的建立及应用_第4页
第4页 / 共71页
c++类的建立及应用_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《c++类的建立及应用》由会员分享,可在线阅读,更多相关《c++类的建立及应用(71页珍藏版)》请在金锄头文库上搜索。

1、Chapter 8 类,面向对象的核心,面向对象的程序设计,本章主要内容, 8.1 类初步 8.2 类的声明与定义 8.3 面向对象的设计思想 8.4 构造函数和析构函数 8.5 this指针 8.6 静态成员和常成员 8.7 在堆上创建类 8.8 友元,8.1 类初步,面向对象的程序设计,一、从结构体到类,回顾:通讯录程序,struct Regist char name20; char gender; int age; char address100; ;,需求:对一条记录进行修改,修改姓名,性别,年龄,地址等数据。,面向对象的程序设计,一、从结构体到类,按照传统的解决方案,需要编写一个函数

2、,Void ChangeValue(Regist r, char *n, char s, int o, char *ad) strcpy(r.name,n); r.sex=s; r.age=o; strcpy(r.address,ad); ,思考:Regist是数据,而ChangeValue是对数据的操作。从逻辑上考虑,它们的关系合理吗?,面向对象的程序设计,一、从结构体到类,从逻辑上讲,“改变数据”是“记录”的功能,那么“改变”这个动作应该是“记录”这一数据类型的一部分。而在上面的实现中,它们的依存关系是相反的,而这也是典型的“面向过程”思想。,设想:能不能把“改变数据”这个动作放到“记录”

3、的内部呢?,面向对象的程序设计,一、从结构体到类,答案是肯定的,C+语言允许将一个函数放在结构体的内部,并且在这种情况下,函数可以直接访问结构体的成员,于是结构体变成:,struct Regist char name20; char sex; int age; char address100; void ChangeValue (char *n, char s, int o, char *ad) ;,面向对象的程序设计,一、从结构体到类,可以将这个设置函数直接定义在类的内部。,进一步思考:对于一个实用的程序,在ChangeValue函数体内还必须进行更多的判断,例如检查姓名和地址是否超过范围,

4、性别字符是否合法等。而上面的程序中,无法阻止结构体的使用者“绕过” ChangeValue而直接操作成员数据。该如何解决呢?,面向对象的程序设计,一、从结构体到类,C+语言提供的解决方法:设置访问权限,struct Regist private: char name20; char gender; int age; char address100; public: void ChangeValue (char *n, char s, int o, char *ad) ;,private:表示之后的数据外部无法访问 public:表示之后的数据外部可以访问 在结构体中,默认是public的,示例

5、1,面向对象的程序设计,一、从结构体到类,在这些变化之后,struct已经远远超出了C语言中“结构体”的范畴,在C+语言中专门引入了一个新的关键字Class,这就是类。,8.2 类的声明与定义,面向对象的程序设计,一、类的声明,struct regist char name20; char sex; int age; char address100; void InputRegist(); void SetRegist(char *n, char s, int a,char *d); void PrintRegist(); ;,类的声明格式: class (struct) 类名 private

6、 : 成员数据; 成员函数; public : 成员数据; 成员函数; protected: 成员数据; 成员函数; ;,面向对象的程序设计,类与对象 类是一个框架,说明了这种数据类型定义变量的组成方式 对象是类的一个实例变量,在内存中占据一定的空间 类声明了一种数据类型,对象类的变量 与结构体变量类似,使用取成员运算符.访问对象的成员变量与成员函数,二、类和对象的作用域,结构体类型结构体变量 类类型类的变量 类(Class)对象(Object),面向对象的程序设计,二、类和对象的作用域,类类型的作用域: 在函数定义之外定义的类,其类名的作用域为文件作用域; 而在函数体内定义的类,其类名的作用

7、域为块作用域 对象的作用域与前面介绍的变量作用域完全相同 全局对象 局部对象 动态对象等,面向对象的程序设计,三、成员函数,将一个函数的声明放在类的说明,表示该函数属于这个类,是成员函数 成员函数的定义可以在类内,但一般是定义在类的外部,定义形式如下:,返回值类型 类名 : 函数名 (参数列表) /函数体 ,面向对象的程序设计,成员函数使用同一个对象的其它成员时,可以直接使用(不用指出对象名)(包括函数成员) 在类的成员函数中有三类不同作用域的变量 函数的内部变量,类的成员变量,文件的变量 逐层隐藏,也可以用域作用符:来指定 一个类的所有对象,共享成员函数的代码,成员函数不占据各对象的空间,三

8、、成员函数,面向对象的程序设计,四、成员的访问权限,私有成员(用private说明的) 私有成员限定在该类的内部使用 私有的数据成员:只允许该类中的成员函数使用, 对于私有的成员函数:只能被该类内的成员函数调用; 类就相当于私有成员的作用域。,面向对象的程序设计,公共成员:关键字public 公有成员的数据或函数不受类的限制,可以在类内或类外自由使用; 对类而言是透明的 保护成员:关键字protected 允许在类内及该类的派生类中使用保护的数据或函数(到继承一章再讲) 保护成员的作用域是该类及该类的派生类 一般我们会将类中的数据成员私有或保护,转而定义一些访问函数来操作他们。,四、成员的访问

9、权限,面向对象的程序设计,class定义类,不特殊说明,成员是private struct定义类,不特殊说明,成员是public,四、成员的访问权限,可见,在不考虑继承的情况下,私有和保护成员基本是一样的。,面向对象的程序设计,五、例子,三角形 学生成绩,示例2与示例3,8.3 面向对象的设计思想,面向对象的程序设计,一、面对对象的概念,对象从程序的角度理解,是对结构体的一种延伸 ObjectOriented 将数据与对数据进行存在的过程结合在一起的一种程序要素 既有数据,又有函数 软件开发中一种新的思想和丰富 OOA OOD OOP,面向对象的程序设计,二、OOP的思想,将代码和数据放到一个

10、程序要素中,统一进行设计和管理 由以函数为中心的设计以对象为中心的设计 对象是第一位的,函数是属于对象的 通过对象来调用函数,而不是过去将数据作为函数的参数 有点:逻辑清晰,避免过多分支,减少函数数量,面向对象的程序设计,四、OO的特征,封装性(Encapsulation) 特点 数据和方法的结合 数据具有隐蔽性(成员的类型),公共、私有、保护成员 目的 保护对象的数据,避免过分暴露; 数据使用更方便; 对使用者隐藏实现的细节,使设计、实现和使用分开 前提是对类的抽象(abstract) 对对象的特征、行为的分析与概括 考虑:封装和继承 对类的整体思考,面向对象的程序设计,继承性(Inheri

11、tance) 从已有的类中通过增加新的成员的办法,产生的新的类 继承的方法:重复使用,增加,修改 基类(base class)和派生类(derived class) 单一继承和多重继承 形成一个类族,面向对象的程序设计,多态性(Polymorphsim) 同一个类族中不同的类,具有相同的方法,但是无论在功能还是实现上都上不同的 调用哪一个方法是由对象所决定的。,8.4 构造函数和析构函数,面向对象的程序设计,一、对象的建立,用已经声明的类来定义一个变量时,就建立的该类的一个对象 对象的生命周期和作用域与普通变量相同 回忆:结构体变量如何初始化? strut student Wangqi=100

12、01,”wangqi”,m,20,”JinZhou”; 思考:类的变量对象如何初始化?,面向对象的程序设计,一、对象的建立,鉴于类的复杂性,像结构体那样的直接初始化方式不能满足需求: 私有成员无法直接初始化 一些成员变量的初始值是通过一个过程计算得到的,无法直接指定值。 面向对象的复杂特性决定了不能直接初始化(继承和多态的存在) 解决方法之一:定义一个赋值函数,把初始化过程包含在这个函数体中,但是必须显式调用,使用不便。并且这种实现并非真正意义上的“初始化”(上一节中三角形的例子),面向对象的程序设计,二、构造函数,C+语言中的解决方法:构造函数(Constructor) 类的特殊成员函数 名

13、称:与类的名称相同 类型:无返值类型 调用:自动 调用的时机:在建立对象调用,那么: 全局对象:在main函数执行前调用; 局部对象:对象定义时 定义了构造函数之后,在建立对象时,通过给出不同的参数就可以自动调用,完成对象的构建。,面向对象的程序设计,二、构造函数,class CDate int year,month,day; public: CDate(int y,int m,int d); ; CDate:CDate(int y,int m,int d) year=y; month=m; day=d; /两种调用方式 CDate day1(2011, 5, 1); CDate day2 =

14、 CDate(2011, 6, 1);,构造函数的例子,示例4,面向对象的程序设计,二、构造函数,可以通过重载的方式,构造多个参数不同的构造函数,用来以不同的方式初始化对象 除了最普通的构造函数,还有几种常见的不同类型的构造函数,示例5,面向对象的程序设计,三、具有缺省参数值的构造函数,与普通函数一样,构造函数可以声明参数的缺省值 在函数声明中给出缺省值 class CDate CDate(int y=2011,int m=5,int d=1); ; CDate day1; CDate day2(2010); CDate day3(2008,6);,示例6,面向对象的程序设计,四、初始化列表,

15、也可以不在构造函数中显式的赋值,而是在构造函数定义中的参数列表后加冒号,然后对成员逐个赋值,这一机制叫做初始化列表。 列表中初始化的顺序是类定义时成员声明的顺序,而不是列表中的顺序 初始化列表的效率很高,并且某些特殊的成员必须在这里得到值,而不能在函数体内赋值。,CDate:CDate(int y, int m, int d): year(y), month(m), day(d) ,面向对象的程序设计,五、缺省的构造函数,没有任何参数的构造函数 当定义一个对象切没给出任何参数值是自动调用该构造函数 CClock: CClock()seconds=0; CClock clock1; 一个缺省的构

16、造函数,和一个全部参数值都要缺省值的构造函数不能同时存在 如果没有任何构造函数,会自动生成一个缺省构造函数,如果已经定义了任何一个构造函数,就不会自动生成了。,示例7;8,面向对象的程序设计,六、拷贝构造函数,构造函数的参数是同类的引用 class X public: X(X 用途: 用一个同类对象来初始化 为什么要使用引用? 用一个对象“初始化出一个相同的对象”,与建立一个新对象再赋值其意义是不同的。 如果没有定义拷贝构造函数,编译系统会自动生成一个。进行逐对成员的赋值(byte-wise),示例9,面向对象的程序设计,六、拷贝构造函数,思考:在什么情况下自动生成的拷贝构造函数会失效?,示例10,面向对象的程序设计,七、析构函数(Destructor),思考:下面的程序在构造函数中用malloc分配了一段内存,如果这个类离开作用域之后便消失了,这段分配的内存会怎样呢?,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

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