




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、备 课 本(2011-2012学年第1学期)计算机科学与技术学院信管专业2009级课程名称 面向对象程序设计 教材名称C+面向对象程序设计教程(第3版) 陈维兴主要参考书 同类 教学大纲类型 2009院修订大纲 任课教师 岳成刚 第1章 面向对象程序设计概述【教学目的与要求】要求学生理解面向对象程序设计的基本概念;了解传统程序设计方法的局限与面向对象程序设计的优点;了解面向对象程序设计语言的发展概况。【重、难点】重点是面向对象程序设计的基本概念;难点是面向对象程序设计与传统程序设计的区别。【教学时数】2【教学方法】讲授与讨论相结合,以讲授为主。【实验项目】无【习题】教材课后习题1.1,1.51
2、.1 什么是面向对象程序设计简单的说,面向对象程序设计是一种程序设计方法。我们已经学习了C语言,C语言是一种结构化的程序设计语言,采用的是结构化的程序设计方法,也就是说程序是由三种基本结构组成的,在C语言中程序由函数组成,其它函数由主函数调用来完成一定的功能,而各个函数均采用这三种基本结构,即顺序结构、选择结构和循环结构。面向对象的程序设计是一种明显区别于结构化方法的程序设计方法,面向对象程序的基本元素不再是函数,而是对象;程序的组成不再是函数的集合,而是对象的集合及其交互。面向对象程序设计是一种新的程序设计范型正如标题所示,面向对象程序设计是一种新的程序设计方法,是一种程序设计范型,所谓范型
3、这个术语,可以理解为规范、模型或方法。面向对象程序设计范型是继面向过程程序设计范型之后非常流行的程序设计方法。该设计方法与传统过程化方法有明显的区别:面向过程程序设计范型主要特征:程序由过程定义和过程调用组成,可用公式表示成:程序过程+调用;支持面向过程程序设计范型的语言有C语言、Pascal程序对象+消息;支持面向对象程序设计范型的语言有C+、Java、C#等。其中C+不仅支持面向对象程序设计范型,同时也支持面向过程程序设计范型,是一种混合型语言。面向对象程序设计的基本概念程基本概念是理论基础,与具体的程序设计语言无关。 士 对象对象这个词语在我们日常生活中是一个使用频率很高的词,在现实生活
4、中对象无处不在,如我在教室里给同学们上课,这里面就有很多对象,我就是一个对象,是一名教师,同学们也是对象,课也是对象,教室同样是对象。大家有没有发现在这句话里所有的名词都是对象。抽象的东西同样也是对象,可以说任何事物都是对象,在面向对象程序设计范型中的对象是对现实生活中对象的一种模拟,在面向对象程序设计范型中,对象是描述属性的数据和对属性数据施加的一组操作的统一体。举个例子,张三是我们班的一名同学,那么对象属性有学号、姓名、成绩等,对象操作有看书、写字等。 类在现实世界中,类是对一组具有相同属性和行为的对象的抽象,如张三、李四都是人,都具有相同的生理构造和相同的行为方式。类和对象之间的关系是抽
5、象与具体的关系,对象是类的一个实例。这种关系和C语言中的数据类型与变量的关系并没有什么两样。如int a,b;int是一种数据类型,a,b是两个不同的变量,a,b具有相同大小的存储空间及相同的加减乘除操作,都是整型变量。在面向对象程序设计范型中,类是对具有相同数据结构和相同操作的一类对象的描述。在C+语言中,数据称为数据成员,操作是用函数来完成的,称为成员函数。在用面向对象程序设计语言描述类与对象时,总是先声明类,再由类来生成该类的对象。可以说类就是生成对象的数据类型,只不过这个数据类型是用户自定义的数据类型。有点类似于C语言中的结构体,只不过C语言中的结构体只有数据而没有操作。假设Perso
6、n是一个已经声明好的类,大家比较一下下面两条语句:Person p1,p10;int i1,i10;这两条语句是不是很相似呢? 消息与方法现实世界中各对象之间互相联系,互相作用,如我给大家讲课,同学们有在听课的行为。同样在面向对象程序设计范型中对象之间也是互相作用的称为对象的交互。对象之间的交互是通过消息传递的机制来完成的,发送消息的对象是消息的发送者,接收消息的对象是接收者。就讲课这个例子来讲,教师讲,学生听,教师是消息的发送者,学生是消息的接收者。在具体的实现面向对象程序设计范型的语言中,向某个对象发送消息是通过调用该对象的成员方法(函数)来实现的。消息与方法的关系是:对象根据接收到的消息
7、调用相应的方法,反过来,有了方法,对象才能响应相应的消息。面向对象程序设计的基本特征面向对象程序设计方法具有4个基本特征: 抽象抽象是对具体事物的共性的一个归纳,在抽象过程中通常忽略与当前主题无关的方面,是对复杂世界的简单表示。如在学生成绩管理系统中,我们只关心学生的学号、姓名、成绩等数据而忽略其身高等数据,而在学生健康管理系统中,身高数据是必须的,相反成绩等数据就不重要了。在面向对象程序设计中的抽象包括数据的抽象和行为抽象,抽象的结果就是声明了一个类型。在C+、Java 位等语言中,这种类型就是类(class。类是对象的抽象,而对象是类的实例。在语句中Person就是一个类名,而是一个对象,
8、p是一个含有10个对象的对象数组,每个对象都有题共同的属性:学号,姓名,成绩。 目:基于慈溪家电产业集群的 封装在现实世界中,封装就是包装,使外界不知事物的具体内容。在面向对象程序设计中,封装就是把数据和操作代码集中起来放在对象内部,尽可能隐藏对象的内部细节。使用一个对象时,只要知道它向外界提供的接口而无需知道它的数据结构细节和实现操作所使用的算法。如我们看电视,只要知道开机,换频道和调声音就行了,没必要知道电视机的内部结构和工作原理。电视机上的几个按钮就是对人们提供的接口。封装的好处是将对象的使用者与设计者分开,隐藏了复杂性,提供了代码的复用性,从而大大提高了软件的开发效率。封装性是面向对象
9、程序设计中一个重要特性,该特性有利于数据安全。如电视机和电脑的机壳保护了里面的元器件一样。 继承继承体系了各相关类之间的“是一种”的关系,如狗是一个哺乳动物。就是说狗类继承了哺乳动物类的所有特性。继承使类之间具有层次关系。若B类继承类A,则类B包含了类A的数据和操作,同时也可加入自己所特有的新的数据和操作。这时A类称为父类或基类,B类称为派生类或子类。类B是从类A派生的。面向对象程序设计提供的继承机制的作用有两个:一是避免公用代码的重复开发,二是通过增加一致性来减少模块间的接口。继承机制很好的体现了“软件重用”的思想,通过继承,派生类可以重用已有软件中的一部分甚至大部分,只需要在派生类中描述基
10、类中没有的数据和操作,大大节省的编程的工作量,同时,派生类还可以覆盖、修改或重新定义基类中的操作。继承从基类个数的多少可以分成单继承与多继承。C+支持多继承,但Java却不支持。单继承指基类只能是一个,而多继承中基类至少有两个。多继承容易产生歧义。 多态面向对象程序设计中的多态是对现实世界中多态的一种模拟,如学生学习这个现象,不同学生的学习方法是不一样的,如小学生的学习主要是死背,而大学生的学习主要使用的是理解记忆。面向对象程序设计中的多态性是指不同对象接收到相同的消息时执行不同的操作。如对于众多的形状类对象都有求面积的方法,但不同的形状对象求面积的公式是不一样的。C+语言支持编译时的静态多态
11、性和运行时的动态多态性,分别是通过函数重载和虚函数来实现的。多态性增加了软件的灵活性和通用性,允许用户建立明确、易懂的通用软件。1.2 为什么要使用面向对象程序设计传统程序设计方法的局限性传统的程序设计是面向过程的结构化程序设计,其局限性至少表现在以下几个方面:究 生产效率低下 第一台计算机问世以来,计算机硬件水平在突飞猛进的发展,而软件的生产能力还是比较低下,体现在开发周期长,效率低,费用高,曾经出现了所谓的“软件危机”。在面向对象程序设计出现之前,人们一直采用结构化的程序设计来解决问题,其主要思想是面向过程的,即功能分解并逐步求精。如Pascal语言和C语言都集中体现了这种结构化的设计思想
12、。传统的程序设计方法很难解决软件的重用性、复杂性和可维护性问题。 高工 随着软件规模的增大,采用传统的程序设计方法的语言需要有更大的信息表示与处理能力,但这是面向过程的程序设计语言所不具备的。 难以适应并行处理、分布式、网络和多机系统等新的程序运行环境。 面向对象程序设计方法的优点 提高了程序的重用性面向过程程序设计的重用性体现在标准函数库的使用上,只提供了非常基本的功能;而面向对象程序设计的重用性体现在类库上,类库中的类不仅可以直接使用,而且可以在类库中类的基础上派生新类,对基类进行扩充和修改以满足应用需求,极大的提高了程序的重用性,因此有人将类称为“软件IC”(软件集成电路)。 有效控制了
13、程序的复杂性面向过程程序设计数据与操作相分离,控制程序的复杂性是程序员沉重的负担,而面向对象程序设计采用封装与信息隐藏技术,将数据与操作放在一个类中形成一个不可分割的整体,有效的控制了程序的复杂性。 改善了程序的可维护性面向过程程序设计方法生产出来的软件很难维护,是软件危机的突出表现,而面向对象程序设计方法产生的软件则容易维护,只要类接口没有改变,类里面的数据表示和操作的实现可作随意修改。比如电视从模拟电视变成了数字电视,但只要遥控器没有变,我们仍然可以很方面的看电视。同时,面向对象程序设计中的封装机制使非法操作成为不可能,大大减少了程序的出错率。 更好的支持大型的程序设计面向对象程序设计采用
14、类作为基本的软件模块,更好地支持大型的程序设计,可将一个任务系统进行分工,每个程序员可以独立设计,测试自己负责的模块。 7 B. 6 C . 3 D. 2 短期6(2008广东理记等差数列 增强了计算机处理信息的范围的前 长期n项和为,若, ,则 ( D A16 B. 24 C. 36 D. 48 能很好适应新的硬件环境8面向对象程序设计中的对象、消息传递等思想和机制与分布式、并行处理、多机系统及网络等硬件环境正好吻合,容易在这些平台上开发软件。 总之,面向对象程序设计解决了面向过程的程序设计的所有局限性。是软件开发史上一个重要的里程碑,现代的程序设计语言几乎都是面向对象的程序设计语言,都是采
15、用面向对象的程序设计范型。7、(2008海南、宁夏文、理设等比数列的公比, 前n项和为,则(索赔(工期、费用)文件资料 C 2.3面向对象程序设计的语言 A. 2 B. 4 C. D. 8(2008江西文、理C+,则( A )A B C D Java工期永久 9(2008全国卷文已知等比数列满足,则( A ) C#A64 B81 C128 D24310(2008全国卷理已知等差数列满足,则它的前10项的和(C )A138 B135 C95 D11.(2008陕西文、理已知是等差数列,则该数列前10项和B)AB100 C C+概述10【教学目的与要求】要求学生了解C+12(2008C的扩充。理若
16、数列是首项为,公比为、B8的无穷等比数列,且【重、难点】aC+程序的构成;难点是C+在非面向对象方面对C的扩充。1 2 13(2008四川理已知等比数列中2,2.4,2.18,2.19,2.20,2.22( D ()() ()13【解1】:C+是从C”,C+经过20多年的发展,至今仍是一种充满活力的程序设计语言。C+继承了C当公比为时, 从而淘汰()()() 故选D;【解2C+全面兼容C,是C的超集1 全面支持面向对象机制工程勘测文件(工程地质、水文地质勘察报告、测量基础资料)2.2 C+永久2上面的程序是用标准C+写的,可以看出C+程序与C程序非常类似,只不过可进行行注释,采用了新的头文件形
17、式,在输入输出上采用预定义的输入输出流对象。3上例只是一个简单的C+程序,并没有体现面向对象程序风格,一个真正的面向对象程序由类的声明和类的使用两大部分组成。后面我们将出逐步给出能运行的C+程序,本章主要讲C+在非面向对象部分对C语言的扩充。长期开发C+程序的过程通常包括编辑、编译、运行和调试等步骤,有很多集成开发平台可以帮助我们完成C+程序的开发,例如最常见的VC+ 6.0,本课我们就使用这个开发平台。大家在学习C语言的时候用的什么平台,我在给094C课程时用的就是这个集成化的开发平台。采用的是Win32 Console Application的工程类型,如果大家学习C时也是用VC6,对它应
18、该不会陌生。若没有使用,则应该查阅本书的上机指导书。C2表2.3 C+在非面向对象方面对C的扩充C+是C的超集,所有C语言的语句依然可以在C+中使用,C+不仅增加了面向对象机制,而且在非面向对象方面也增加了一此新的特性。行注释行注释的符号是/,顾名思义,行注释用来对一行的语句进行注释。C语句的注释方法在C+用cin来从键盘接收数据,用cout来向显示屏输出数据,同时C语言中的printfscanf两个函数也是可以在C+中使用的。只不过C+的输入输出更容易使用。下面再给出两个使用cin和cout的示例。三、监理工作管理及协调文件1这个示例非常简单,从键盘上接收名字,然后输出一个招呼。C+输出数值
19、时采用的默认数制是十进制,如果想用八进制或十六进制输出数值时,则要用到操纵符oct2监理实施细则(一类及特殊项目编制B11表短期长期大家思考一下,在输出8时,结果又是什么呢?档案馆在中,允许变量声明与可执行语句在程序中交替出现,这在C语言中是不允许的,除非使用语句块。C+允许变量在使用前在任意位置定义,极大提高了程序的灵活性。当然也可采用C语言的定义形式,到底采用哪种形式,一个合理的建议是:在大函数中,在最靠近使用变量的位置声明,而在较短的函数中把变量集中在函数开始处说明较好。下面给出一个C+4监理日记B14表长期5监理工作联系单C1表#include using namespace std;
20、/演示C+局部变量的定义int main(监理意见int i=25;cout int j=30;cout return 0;td结构名、联合名与枚举名可直接作为类型名B8表在C+中,结构名、联合名、枚举名可直接作为类型名,而在C语言中必须给出全名。示例程序如下:8工程会议纪要B12表#include using namespace std;int main(int argc, char* argvenum Sexfemale,male;cout return 0;;当公比时, 长期 故选D;长期(2008天津文 若等差数列的前5项和,且,则( B )A12 B13 C14 D1515(2008
21、浙江文)已知an是等比数列,an=2,a3=,则公比q=( D )(A (B-2 (C2 (D16(2008浙江理)已知是等比数列,则= ( C )(A)16() (B)16() (C)() (D)()17 (2008重庆文已知an为等差数列,a2+a8=12,则a5等于( C )(A4 (B5 (C6 (D7二、填空题:1(2008安徽文)在数列在中,,其中为常数,则 1 2(2008安徽理)在数列在中,,其中为常数,则的值是 1 3(2008海南、宁夏文已知ANTDspan0。质量控制文件#include using namespace std;int main(int a=1;const
22、 int T1=a+a;const int T2=T1-T1;coutT2 is return 0;/例5短期,完全正确。const也可与指针一块使用,它们组合使用情况较复杂,可归纳为三种: 指向常量的指针变量:如const char *name=”Zhang”; 指向变量的常指针:如char * const name=”Zhang”;平面控制桩、控制网、高程控制网及水准 指向常量的常指针:如const char * const name=”Zhang”A4表5长期6cout cout /指向变量的常指针char * const name1=Wang;/此句也不对,教材错了,在初始化时Wang
23、在常量区 name13=L;/可进行如下修改char *const name2=tmp;name23=L;cout /指向常量的常指针const char * const name3=tmp;关于“申论”的一些经验之谈 6+a1=4,则Log2f(a1f(a21.设备进场报审表SaaS是什么的简称?#include using namespace std;桩基、基础(坑、槽、楼层定位放线核验表、竣工测量等/指向常量的指针变量A4表长期沉降观测记录报验A4表短期长期垂直度观测记录报验A4表短期长期A9 -6 A 长期5(2008设数列D 正确答案A选择题 ,怎样确定申论主题A 公有云,面向公众服
24、务或大行业集团。 故应填D 行业云,通过技术连接实现数据/(2008四川理设等差数列的前项和为,若,则的最大值为_4_。6【解】:等差数列3. 项和为,且A 虚拟化所实现的计算资源池化、动态调配、自动化管理、高可用等功能是 申论范文:警惕金融腐败“期权化” 8, /此句也不对 name3=ok?;正确答案B从上例可以看出,使用const可以进行更严格的检查。,应填74. 8 A 要选择同样的虚拟化产品和技术,这样才具有未来应用和数据在私有云和公有云之间自由移动的基础。/所以C 云平台产品必须具备跨越公、私有云(2008重庆理设Sn=是等差数列n的前n项和,a12=-8,S9=-9,则S16以下
25、属于云计算的特征的有?三、解答题:A 基于互动的。B 可伸缩,有弹性的。C 多租户,共享的。D 依托于互联网技术。正确答案BCD10材料、构配件进场后复检试验报告,砂浆、砼配合比报告,工艺及设备试验、试车报告短期A 20世纪申论范文:雇员制有利于打造“服务型”政府 B 20世纪60年代C 20世纪D 20年代正确答案正确答案C监理文件分类使用表格保存单位及期限7. 虚拟局域网协议允许在以太网的帧格式中插入一个 监理 VLAN 标记(tag,用来指明发送该帧的工作站属于哪一个虚拟局域网。B 2字节C 3字节11D8.(2008安徽文)设数列满足其中为实数,且(9. 在中国,谁利用计算机网络发出了
26、第一封电子邮件?A 王运峰教授B 胡启恒院士C 侯自强院士商品主管10. 目前最大的智能终端操作系统输出国是?()若(3 由(1营销经理若13. 关于服务器虚拟化的优势的说法不正确的是? A 由对任意成立,知。下面证岗位分析日期方法一:假设,由函数2010年3月不能对恒成立,导致矛盾。cout cout1+2 doubled is 申论写作:应正视官员的功利价值观 C+允许在定义函数时,给出部分参数的默认值,具体的定义形式见如下程序示例,相关说明见教材。B锅炉除尘改造项目 直接上级岗位名称商品主管岗位编号A ()设营销部,求数列的前项和B;本岗位关键职责描述:1、 加盟商、代理商订单、补单、销
27、售数据的收集2、 客户往来对账的核对及催款B 3、 退货金额的计算C 不同虚拟机上运行的操作系统必须相同。短期长期#include using namespace std;int sum(int a,int b,int c=10return a+b+c;A VMQB VMMC VMP cout cout 其他长期2.3.8 函数的重载监理旁站记录B15长期4监理平行检验及抽检资料D类表长期有关质量问题的监理工程师通知单及回复单B1表、A6技术长期,长期2013年11月8日目 2(2008安徽理)长期设数列满足为实数()证明:对任意A 对资源的完全控制。B 资源的隔离和保护。C 实现要求上,要能
28、够有效的防止内存泄露和网络传输的信息泄露。()设正确答案ABCD)设,证明:2解 (1 必要性 : 解:()由于a1=1,正确答案ABCD#include using namespace std;void main(int i;int &j=i; /订单数据的收集A 克隆虚拟机是部署虚拟机的另一种方式。又 C 被克隆的虚拟机可处于开启状态,也可处于关闭状态。D 为防止发生软件和网络冲突,建议自定义克隆的客户操作系统。充分性 :设 ,对span所谓函数重载就是允许函数名相同而参数类型或个数不同。这在C语言中是不允许的,C+当时,#include using namespace std;int s
29、quare(int ireturn i*i;long square(long i,由数学归纳法知对所有(2 设 double square(double ireturn i*i;void main(long j=1234;double k=4.67;cout cout cout 工程投标书或预算书1)知,所以 以下关于服务器虚拟化关键技术(安全技术)的描述有误的是?A5表、B3(3 设 自动升级,对虚拟化软件及管理工具自动扫描安全漏洞,自动更新补丁。,当时,结论成立当D A11正确答案D 3(2008北京文)数列工程竣工结算审核意见书#include B7using namespace std
30、;满足()当a2=-1时,求及a3的值;2.1设计原则 4C+不仅支持C()数列anB vDSNetwork Health Check、Port Mirroring、Roll Back and Recoveryint i=(doubled;/C Stylecout int j=double(d;cout 频次:季couti= 变量 i 的地址: &i ()数列变量j的地址:档案馆七安全监理资料由a1using namespace std;void main(2.5 项目投资估算 10382.6固定答题模式套写破解申论int i=10;int *pi=&i;/pi是指向变量i的指针变量,本身占用
31、存储空间int &j=i;/j是变量i的别名,不占内存空间,是i的别名couti= cout*pi=*pi 是对 i 的间接使用 coutj= i=50;2.3.2改造方案 施工安全评价申请表(36A15表有关安全问题的监理工程师通知单及回复单B1表、A6 9八using namespace std;void swaybypointer(int *pi,int *pjint tmp=*pi;*pi=*pj;*pj=tmp;void myswap(int &i,int &jint t=i;i=j;j=t;void main( couti= 2.7 技术指标 返回引用的函数可以作为赋值运算的左值,
32、如下例所示。;void main(申论热点 2double r,i;mg/m3 void init(double rr,double ii申论热点:冠成集团从事“三农实践”的报告 45C+还提供了比结构体更安全的数据类型,用来封装数据与操作的数据类型,那就是类。类类型与结构体类型都是抽象数据类型,那么类类型与结构体类型有何区别呢?大家可将上例中的关键字struct修改成class,重新编译程序就可以看到会出现编译错误。原因是C+在默认情况下,即不指定成员的访问属性的情况下,结构体中的所有成员都是公有的,而类中的成员都是私有的,除此之外,类和结构体完全相同。在实际应用中,一般把需要保护的数据设置
33、为私有的,而把成员函数设置为公有的,作为类与外界的接口。165既然C+有定义类的机制为什么还要支持结构体的定义呢,这完全是为了和C兼容。所以尽管类和结构体功能基本相同,但是建议大家尽量使用类来定义抽象数据类型,写出完全体现N*,满足:当nn 申论热点:我们需要什么样的基础教育改革? 0;当n这种方式定义的成员函数是普通的成员函数,不是内联的成员函数,一般在头文件中进行类的声明,类声明中包含数据成员定义和成员函数的声明;另外还有一个实现文件(CPP),在实现文件中给出成员函数的具体实现。/2申论复习及热点参考 3 系统简图 int a=1,3,5,7,9;int &index(int iretu
34、rn ai;25. 下列哪种活动不属于需求开发活动?申论热点:为人民服务让人民满意 43D 功能设计,第十二届全国人民代表大会常务委员会修订通过了中华人民共和国环境保护法,将于2015年10【重、难点】重点是类及对象的定义与使用、对象的构造与析构;难点是对象参数、对象的赋值与复制,类的静态成员与友元、类的组合应用。44A 申论热点:农民税收负担过重问题解答 347class Complex正确答案D/3A_1.h/此文件只是声明Point类class Pointprivate:int x,y;public:void setpoint(int,int;/设置点坐标int getx(;/取横坐标i
35、nt gety(;/取纵坐标;下面是该类的实现源程序:/3A_1.cpp#include 3A_1.hvoid Point:setpoint (int a,int bx=a;y=b;int Point:getx (return x;int Point:gety(return y;下面写个测试程序来测试该类:/test3A_1.cpp#include 3A_1.h#include using namespace std;void main(Point p;p.setpoint (3,4;cout横坐标: 纵坐标: 由上面这个例子可以看出,类的声明,实现和使用分别在三个文件中,这是写C+程序推荐使
36、用的良好风格,用VC6向导生成的代码都是采用这种风格。可以演示一下给同学们看看。最后要说明的一点就是要注意在类的实现文件中,成员函数的定义方法与以前C函数定义方法的区别,使用了作用域运算符。 方式二:类内声明并实现(隐式内联成员函数)在声明类的同时,实现了其中的成员函数,这种方法与上面写的复数例子完全一样,大家可参照上面复数的例子,对这个点运算的例子进行改写,作为课后作业去完成。一种可供参考的写法如下,写成两个文件:/3A_2.hclass Pointprivate:int x,y;public:void setpoint(int a,int bx=a;y=b;int getx(return
37、x;int gety(return y;该文件中在定义Point类的同时实现了它三个成员函数,这个三函数都是隐式的内联成员函数,所谓隐式的就是没有写inline关键字。/test3A_2.cpp#include 3A_2.h#include using namespace std;void main(Point p;p.setpoint (22,33;cout( 这个文件写个主函数,测试了上面写好的Point类。在编译时,内联函数中的代码会被展开到相应位置,而不会去调用函数,这与前面讲的普通内联函数并没有什么两样。 方式三:显式内联成员函数所谓显式内联成员函数,就是在类内声明成员函数时加了in
38、line关键字并不实现该函数,成员函数的实现是在类体的外面。这里要特别注意与方式一的区别,显式内联成员函数的类外实现必须与类定义在同一个文件中。用这种方式实现相同功能的代码如下所示:/3A_3.hclass Pointint x,y;public:inline void setpoint(int a,int b;inline int getx(;inline int gety(;void Point:setpoint (int a,int bx=a;y=b;int Point:getx (return x;int Point:gety(return y;注意上面代码中显式内联成员函数与类声明必
39、须放在同一个头文件中,否则程序会在链接的时候发生错误,可以演示一下给同学们看看。测试该类的代码如下:/test3A_3.cpp#include 3A_3.h#include using namespace std;void main(Point p;p.setpoint (1,2;cout成员数据或对象指针名-成员函数名(实参表;三是通过对象的引用访问。实例分析与演示。类的作用域和类成员的访问属性所谓类的作用域是指在类的声明中的一对花括号所形成的区域。在类作用域内,一个类的任何成员函数可以不受限制访问类中所有成员,而在类作用域外,对该类的成员访问是根据成员的访问属性来决定的。到目前为止,我们可
40、以将类的成员访问属性归纳为两类:公有和私有。还有一种是保护属性,我们在下章介绍。公有成员不仅在类内可访问,而且在类外也可通过该类对象进行访问,而私有成员则只能在类内能被访问。举例验证说明。一般来说,公有成员是类的对外接口,而私有成员是类的内部数据或内部实现,不希望外部访问。将类的成员划分不同的访问级别有两个好处:一是信息隐藏;二是数据保护。3.2 构造函数与析构函数构造函数与析构函数是用来完成对象的建构与销毁,它们都是属于某个类的成员函数,可由用户提供也可由系统自动生成(默认构造函数与默认析构函数)。在定义对象时,对数据成员赋初始值,称为对象的初始化。在定义对象时,如果没有对数据成员赋予初始值
41、,则它的值是不可预知的。如果一个类中所有的成员都是公有的,则可以在定义对象时对数据成员进行初始化,这种方法类似于结构体变量的初始化,但若类中有私有或保护成员时,则不能使用该方法,这时可使用公有成员函数来完成初始化,但更好的方法是使用构造函数。构造函数是一种特殊的成员函数,主要用于对象分配空间,进行初始化,构造函数的名字与类名相同,可以有形式参数,但不能有返回值,构造函数可以进行重载。并且该函数是在定义对象时被自动调用的。在实际应用中,通常需要给每个类定义构造函数,如果没有给类定义构造函数,则编译系统会自动的生成一个默认的构造函数,默认的构造函数不带任何参数,函数体也是空的,它只能为数据成员开辟
42、存储空间,而不能对对象中的数据成员赋值。教材实例分析演示。除了在构造函数中用赋值语句对数据成员进行初始化,还可用成员初始化列表来实现数据成员的初始化。这种方法不是在函数体中用赋值语句对数据成员初始化,而是在构造函数首部用成员初始化列表完成。其一般形式是:数据成员名(初始值),数据成员名(初始值),在C+中某些类型的成员只能通过成员初始化列表来完成初始化,如const数据成员,引用类型的数据成员都只能用成员初始化列表来初始化。教材实例分析演示。数据成员是按照它们在类中的声明顺序来进行初始化的,与它们在成员初始化列表中列出的顺序无关。教材实例分析演示。说明了上面这句关键的话。与一般成员函数或函数类
43、似,构造函数也可以进行重载,只要参数类型或参数个数不同即可。教材实例分析演示。如果在类中用户没有定义构造函数,系统会自动提供一个函数体为空的默认构造函数,但是只要类中定义了一个构造函数,系统将不再给它提供默认构造函数。教材实例分析演示。尽管构造函数可以重载,但在定义一个对象时,只执行其中一个构造函数,到底执行哪个,则视提供的实际参数而定。教材实例分析演示。教材实例分析演示。如果构造函数在类的声明外部定义,默认参数应该在类内声明时指定,而不能在类外定义时指定;若全部参数都是默认参数,则不应再写出默认构造函数,否则会产生歧义导致编译通不过;在一个类中定义了全部的默认参数的构造函数后,不能再定义重载
44、构造函数,因为这样也会产生歧义。因此不能同时使用构造函数的重载和有默认参数的构造函数。析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。析构函数名与类名相同,但前面必须加一个波浪号;析构函数不能有返回值类型;析构函数也没有参数,不能被重载,因此析构函数只能有一个。在撤销对象时,析构函数会被自动调用。教材实例分析演示。每个类必须有一个析构函数,若没有显式的定义析构函数,则编译系统会自动的提供一个默认的析构函数,函数体为空。对于大多数类而言,默认析构函数就能满足要求,但在需要进行动态存储申请和释放时,则应该提供析构函数,教材上的示例分析与演示。析构函数在对象超出其作用域时,会被自动调
45、用。另外,如果一个对象是用new运算符动态创建的,则在使用delete运算符释放时,delete会自动调用析构函数。增加一个实例如下:#include / 全局对象没有被析构,换成 好像就被析构了using namespace std;class Demopublic:Demo(int x=0this-x=x;cout Demo(cout private:int x;Demo a(1;void main(coutEnter main Demo b(2;Demo *p=new Demo(3;delete p;coutleave main 3.3 对象数组与对象指针对象数组是对象的数组,每个元素都
46、是一个对象,不仅有数据成员还有函数成员。定义对象数组的一般形式是:类名 数组名下标表达式;建立对象数组时,同样要调用构造函数,有几个数组元素就要调用几次构造函数。如果构造函数只有一个参数,在定义对象数组时可以直接在等号后的花括号内提供实参。教材实例分析演示。与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素。教材实例分析演示。以上例子中的构造函数只有一个参数或没有参数,如果构造函数有多个参数,则在定义对象数组时只需在花括号中分别写出构造函数并指定实参即可。教材实例分析演示。在对象数组超出其作用域时,系统会自动对每个对象数组中的对象调用析构函数。对象指针就是存放对象地址的变量。说明
47、对象指针的语法与说明其他数据类型指针的语法完全一样。使用时,首先要把它指向一个已创建的对象,然后才能用指针进行操作。用对象指针可进行单个对象的访问,也可进行对象数组的访问。一般而言,当指向对象数组的指针加减1时,总是表示指向下一个或上一个对象。教材实例分析演示。修改成对象数组后分析演示对象数组指针的应用。实际上,C+编译系统只用一段空间来存放类的函数成员,各个类的对象共享这些函数成员,不象数据成员,各个对象都有自己的。也就是说,成员函数的代码是存储在对象空间之外的。每个对象都有属于自己的数据成员,但是所有对象的成员函数代码却合用一份。C+为成员函数提供了一个名字为this的指针,每当创建一个对
48、象时,系统就把this指针指向该对象,即this指针的值是当前调用成员函数的对象的起始地址。在通常情况下,this指针是隐含存在的。教材实例分析演示。3.4 string类C+不仅支持C中的字符串,也支持字符串类string。建议大家使用string类,该类将串数据和串操作进行了很好的封装,完全是面向对象的形式。使用string类必须在程序的开头包含头文件string。3.5 向函数传递对象对象作为函数的参数与传递基本类型的变量类似,也是按“传值调用”的方式进行。教材实例分析演示。对象指针作为函数参数,实现了“传地址调用”。教材实例分析演示。使用引用作为函数参数也可以修改实参对象的值,但引用将
49、更直接简单。教材实例分析演示。3.6 对象的赋值和复制同类型的对象之间可进行赋值操作。教材实例分析演示。两个对象音的赋值,仅仅使这些对象中的数据成员相同,两个对象仍是分离的,对象赋值是通过默认赋值运算符函数实现的,关于赋值运算符函数将在运算符重载的相关章节讲述。将一个对象的值赋值给另一个对象时,多数情况下是成功的,但当类中有指针成员时,可能会产生错误。这将在第5章中分析。对象的复制是通过拷贝构造函数的调用来完成的。拷贝构造函数是一个特殊的构造函数,其形式参数是本类对象的引用。其作用是在创建一个新对象时,使用一个已经存在的对象进行初始化。每个类都必须有一个拷贝构造函数,如果程序中没有给出拷贝构造
50、函数,系统会自动生成一个。系统生成的拷贝构造函数,用于复制出数据成员完全相同的新对象。程序员也可自定义拷贝构造函数。教材实例分析演示。可以看出,当用一个对象去初始化另一个对象时,可以有选择的复制。调用拷贝构造函数有两种方式:一种形式是:类名 对象2(对象1;另一种形式是: 类名 对象2对象1;大家注意这种形式调用拷贝构造函数与对象间赋值的区别:赋值运算符用于已有值的对象上,也就是说,拷贝构造函数只有在定义一个新对象并且用已有的对象进行初始化时才调用;而赋值运算符函数在已初始化(已定义)时才被调用。示例代码如下:#include using namespace std;class Apublic
51、:A(int y=111x=y;A(const A& ax=2*a.x;coutcopy construction A& operator=(const A&ax=4*a.x;cout= called return *this;int getx(return x;private:int x;void main(A a1;couta1: A b;b=a1;/调用赋值运算符函数coutb: A c(b;coutc: 在通常情况下,默认的拷贝构造函数是能胜任工作的,但如果类中有指针类型的数据成员时,调用默认的拷贝构造函数有时会产生错误。默认拷贝构造函数的使用示例分析演示。调用拷贝构造函数的3种情况:一:当用类的一个对象去初始化另一个对象时;二:当函数的形参是类的对象时;三:当函数的返回值是类的对象时。3.7 静态成员包括静态数据成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻璃纤维增强塑料制品项目可行性研究报告
- 2025年中国水溶肥产品项目创业计划书
- 2025年中国铝镁合金烤漆带项目创业计划书
- 2025年中国欧米伽3项目商业计划书
- 中国石墨烯电池项目创业计划书
- 保定市人民医院员工职业发展指导考核
- 大庆市人民医院专科护理质量提升考核
- 通辽市中医院立体定向放疗SBRTSRS计划设计考核题库
- 长治市人民医院振幅整合脑电图考核
- 中国核酸项目商业计划书
- 2025年三力测试题试题及答案
- 江苏省建筑与装饰工程计价定额(2014)电子表格版
- 物业交接表格全模板
- 常用食品包装技术与设备
- 2021届语文大总复习课时作业36文学类文本阅读-小说(二)含解析
- 2023年学宪法讲宪法知识竞赛题含答案
- GB/T 3360-1982数据的统计处理和解释均值的估计和置信区间
- 思想道德与法治基础:第一章 领悟人生真谛 把握人生方向
- 2022年DISC职业性格测试(40题附完整分析)
- 《星际穿越》-课件
- 小学竖笛社团活动计划及活动总结
评论
0/150
提交评论