欢迎来到天天文库
浏览记录
ID:51777168
大小:566.72 KB
页数:49页
时间:2020-03-07
《C++程序设计与实践 教学课件 作者 白忠建chapter05 类和对象.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++程序设计与实践第五章类和对象电子科技大学信息与软件工程学院白忠建第五章类和对象本章要点类类型。C++语言与C语言最大的不同,在于C++语言增加了面向对象的概念。访问控制。类包含public、private和protected三类成员。类和对象的关系。类是对象的模型,对象是类的实例。静态成员。所有的类对象共享该类的静态数据成员。静态函数成员只能直接访问类的静态数据成员。结构和联合都是类。5.1问题引入观察一下制订的C风格方案(以Rectangle为例)structRectangle{stringname;i
2、ntwidth,height;//宽和高};//operationprototypesvoidcreate(Rectangle&,intw=0,inth=0);voiddraw(Rectangle&);doublearea(Rectangle&);提问:请大家说说这种设计有什么不利因素?5.1问题引入C风格方案存在着几个非常明显的缺陷:对象的属性与对象的行为是分离的,二者之间没有明确而稳固的联系;如果说Rectangle结构体变量是一个对象,那么观察程序的结构和逻辑,可以得到这样的印象:该对象的行为(函数)成为
3、主导者,对象反而成了被加工者。这与自然的思维有所区别;从信息安全的角度出发,对象的属性对其他所有客户程序员(代码的使用者)都是公开的,也就是不受保护的。这使得客户程序员可以绕开代码创建者提供的接口函数,自己编码操纵对象的属性。这在一定程度上为所有代码带来了潜在的危害。5.1问题引入如何解决上述问题实际上是困扰了程序设计模式多年的老问题。而当面向对象思想和技术出现并且变得相当成熟后,解决问题的方法非常直截了当,就是将对象的属性和行为都封装在一个闭包里,数据和行为被严格地保护起来,仅对外部程序员提供可以操纵的公共接
4、口。这种做法需要一种新数据类型的支持。这就是C++的精华:类(class)类型。5.2类与对象5.2.1类的定义类类型的形式化定义为:classclassName{属性列表;行为列表;};//注意这个分号的存在。很多的编译错误源于这个分号的缺漏这里,className是用户创建的类型名。5.2类与对象classRectangle{stringname;intwidth,height;//高和宽voidcreate(intw=0,inth=0);voiddraw();doublearea();stringwhat
5、();};原来维系关系的对象参数不再需要了数据成员成员函数{}定义了一个类作用域。在该作用域中,无论定义在哪里,或着顺序如何,所有成员都是互相可见的。5.2类与对象5.2.2类和对象与其它类型一样,类只是一种形式化的规格说明。要使用类提供的功能,必须使用类的实例(类的静态成员(5.3.3)例外)。类的实例称为“对象”。一个类可以定义多个对象。定义对象的过程称为“实例化(instantiation)”,而一个对象也称为类的“实例(instance)”。5.2类与对象定义一个类对象就像定义一个整型变量一样。例如:R
6、ectanglerect;inta;类类型Rectangle和整数类型int代表的是一般的概念,对象rect和整型变量a代表的是具体的实例,而每一个实例都要在内存中占据一定的存贮空间。类型名对象名5.2类与对象rect对象的内部结构相对a而言比较复杂。提问:为什么rect的成员函数没有包含在它的内存布局中呢?5.2类与对象与结构体类似,我们使用成员选择运算符.来访问对象的成员,例如:rect.widthrect.area()这与C的结构体有很大不同:C结构体不能包含成员函数5.2类与对象可以将类和对象的关系归纳
7、如下:类代表了一组对象的共同性;对象被赋予了具体的性质。类在概念上是一种抽象机制,它抽象了一类对象的存储和操作特性;对象是类的一个实现,占据了物理存储器。在系统实现中,类是一种共享机制,它提供了一类对象共享其类的操作实现。这些操作通过类的实例(对象)来完成。类是一种封装机制,它将一组数据和对该组数据的操作封装在一起;对象是这种封转机制的具体实现。类是对象的模型,对象承袭了类中的数据和方法(操作)。只是各实例对象的数据初始化状态和各个数据成员的值不同。5.2类与对象5.2.3访问控制有了Rectangle的定义,
8、我们就可以定义这个类的对象来实现相应的功能。例如:Rectanglerect;rect.width=3;rect.area();然而不幸的是,以上两条对对象成员的访问是有问题的,在编译时会得到错误提示。rect.cpp:3:6:error:'intRectangle::width'isprivaterect.cpp:10:7:error:withinthiscontextrect.cp
此文档下载收益归作者所有