程序设计类与对象_第1页
程序设计类与对象_第2页
程序设计类与对象_第3页
程序设计类与对象_第4页
程序设计类与对象_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.C/C+程序设计教程2022-3-6.2第第1章章 类和对象类和对象 应该重点掌握以下内容:应该重点掌握以下内容:n 面向对象程序设计的基本特点面向对象程序设计的基本特点n 类和对象的定义和使用类和对象的定义和使用n 构造函数和析构函数构造函数和析构函数n 拷贝构造函数和堆对象、对象数组拷贝构造函数和堆对象、对象数组n 友元函数和友元类友元函数和友元类2022-3-6.3第第1 1章章 类和对象类和对象n1.1 1.1 面向对象程序设计概述面向对象程序设计概述 n1.2 1.2 面向对象程序设计的基本概念面向对象程序设计的基本概念n1.3 1.3 类和对象的定义类和对象的定义 n1.4 1.

2、4 构造函数和析构函数构造函数和析构函数 n1.5 1.5 类和对象的进一步应用类和对象的进一步应用 n1.6 1.6 静态成员静态成员n1.7 1.7 友元函数和友元类友元函数和友元类n1.8 string1.8 string类类n1.9 1.9 综合应用实例综合应用实例2022-3-6.41.1 1.1 面向对象程序设计概述面向对象程序设计概述一、什么是面向对象程序设计一、什么是面向对象程序设计 面向对象程序设计(面向对象程序设计(Object Oriented Programming-Object Oriented Programming-简称简称OOPOOP)是软件系统设计与实现的新方

3、法,这种新方法即吸取了结构化程序设计是软件系统设计与实现的新方法,这种新方法即吸取了结构化程序设计的全部优点,又考虑了现实世界与面向对象空间的映射关系,所追求的的全部优点,又考虑了现实世界与面向对象空间的映射关系,所追求的目标是将现实世界的问题求解尽可能的简单化。目标是将现实世界的问题求解尽可能的简单化。二、面向对象程序设计的基本思路二、面向对象程序设计的基本思路 例如:生产一台电脑例如:生产一台电脑2022-3-6.51.2 1.2 面向对象程序设计的基本概念面向对象程序设计的基本概念 1.2.1 1.2.1 类类 1.2.2 1.2.2 对象对象1.2.3 1.2.3 封装(封装(enca

4、psulationencapsulation)与数据隐藏)与数据隐藏1.2.4 1.2.4 继承(继承(inheritanceinheritance) 1.2.5 1.2.5 多态性(多态性(polymorphismpolymorphism) 1.2.6 1.2.6 消息消息2022-3-6.61.2.1 1.2.1 类类 一、现实世界与面向对象系统对应关系一、现实世界与面向对象系统对应关系 二、什么是类二、什么是类1. 1. 类是一种复杂的数据类型,它将不同类型的数据和与这些数据相关的类是一种复杂的数据类型,它将不同类型的数据和与这些数据相关的操作封装在一起。类是对现实世界客观事物的抽象。操

5、作封装在一起。类是对现实世界客观事物的抽象。2. 2. 两方面的要素:两方面的要素: 属性(属性(atrributeatrribute)-数据数据 行为行为(behavior)(behavior) - -数据的操作数据的操作 (函数)(函数)2022-3-6.71.2.2 1.2.2 对象对象一、什么是对象一、什么是对象 对象是类的一个实体,又称为实例对象是类的一个实体,又称为实例 二、对象与类的关系二、对象与类的关系三、对象与对象之间消息传递三、对象与对象之间消息传递 对象对象1对象对象2对象对象3对象对象4消息消息消息消息人类人类姓名姓名年龄年龄 身高身高体重体重走路走路学习学习说话说话开

6、车开车数据抽象数据抽象小小王王小小李李小小张张人类人类的对象的对象2022-3-6.81.2.3 1.2.3 封装与数据隐藏封装与数据隐藏 一、什么是封装一、什么是封装n封装是指将对象的数据和与这个数据有关的操封装是指将对象的数据和与这个数据有关的操作放在一起。作放在一起。n各个对象之间相互独立,互不干扰。各个对象之间相互独立,互不干扰。n对象只留少量的接口,以便与外部联系。从外对象只留少量的接口,以便与外部联系。从外部看对象就像一个部看对象就像一个“黑匣子黑匣子”,数据和方法是,数据和方法是隐蔽的、看不见的。隐蔽的、看不见的。n当用户使用对象时,不必知道对象的具体实现当用户使用对象时,不必知

7、道对象的具体实现细节,只需要根据对象提供的外部接口访问对细节,只需要根据对象提供的外部接口访问对象即可。象即可。二、封装应具有以下几个特点二、封装应具有以下几个特点n具有一个清楚的边界,私有成员封装在内部,具有一个清楚的边界,私有成员封装在内部,外部不可以访问外部不可以访问n提供必要的接口提供必要的接口n对象内部的数据和方法是受封装外壳保护的,对象内部的数据和方法是受封装外壳保护的,其它对象不能直接使用。其它对象不能直接使用。主机主机主板主板显卡显卡声卡声卡内存内存数据传输线数据传输线电源线电源线USB接口接口串行接口串行接口电源开关电源开关 内内部部私私有有成成员员与与外外部部接接口口202

8、2-3-6.91.2.4 1.2.4 继承继承 一、继承概念的提出一、继承概念的提出例如:已定义电视机类,现需要定义彩色电视机类例如:已定义电视机类,现需要定义彩色电视机类解决方法:解决方法: 1. 1.重新设计重新设计 2. 2.继承:继承原来电视机的属性和方法,再添加彩色电视机自己特继承:继承原来电视机的属性和方法,再添加彩色电视机自己特有的新的属性和行为有的新的属性和行为 二、继承的概念二、继承的概念 C+ C+提供的继承机制提供了类之间相互关系的解决方案,使某个类可提供的继承机制提供了类之间相互关系的解决方案,使某个类可以继承另外一个类的特征和能力。以继承另外一个类的特征和能力。 使用

9、继承符合人们对事物的认识和叙述,大大简化了对问题的描述,使用继承符合人们对事物的认识和叙述,大大简化了对问题的描述,提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率,实提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率,实现现软件重用软件重用(software reusabilitysoftware reusability)。)。2022-3-6.101.2.5 多态性(多态性(polymorphism) 一、多态性的概念一、多态性的概念 多态性:多态性:描述的是同一个消息可以根据发送消息对象的不同采用不同的描述的是同一个消息可以根据发送消息对象的不同采用不同的行为方式。行为

10、方式。 例如:例如: 学校的上课铃响,不同班级的学生进入不同的教室学习,不同的老学校的上课铃响,不同班级的学生进入不同的教室学习,不同的老师进入不同教室开始讲课,不同的对象会作出不同的响应。可以看到学师进入不同教室开始讲课,不同的对象会作出不同的响应。可以看到学生和教师在接受到同一消息(上课铃声)时,执行不同的操作,这就是生和教师在接受到同一消息(上课铃声)时,执行不同的操作,这就是多态的表现。多态的表现。二、二、C+C+支持多态支持多态 静态多态性静态多态性 动态多态性动态多态性 2022-3-6.111.2.6 1.2.6 消息消息 面向对象技术的封装使得对象相互独立,各个对象要相互协作面

11、向对象技术的封装使得对象相互独立,各个对象要相互协作实现系统的功能则需要对象之间的消息传递机制。消息是一个对象实现系统的功能则需要对象之间的消息传递机制。消息是一个对象向另一个对象发出的服务请求,进行对象之间的通信。也可以说是向另一个对象发出的服务请求,进行对象之间的通信。也可以说是一 个 对 象 调 用 另 一 个 对 象 的 方 法 (一 个 对 象 调 用 另 一 个 对 象 的 方 法 ( M e t h o dM e t h o d ) 或 称 为 函 数) 或 称 为 函 数(FunctionFunction)。)。2022-3-6.12面向过程与面向对象程序设计方法的比较一、面向

12、过程程序设计方法一、面向过程程序设计方法 程序程序 = = 数据结构数据结构+ +算法算法二、面向对象程序设计方法的规律是:二、面向对象程序设计方法的规律是: 对象对象 = = (数据结构(数据结构+ + 算法)算法) 程序程序 = = 对象对象 + + 对象对象 + + 对象对象 + + + + 对象对象2022-3-6.131.3 类和对象的定义类和对象的定义 一、类定义组成一、类定义组成 数据成员:数据成员:说明类的属性说明类的属性 成员函数(又称函数成员):成员函数(又称函数成员):对类数据成员操作的类内函数,又称为对类数据成员操作的类内函数,又称为方法。方法。二、类定义的一般格式为二

13、、类定义的一般格式为 class class 类名类名 public : public : 数据成员和成员函数实现数据成员和成员函数实现 protected:protected: 数据成员和成员函数实现数据成员和成员函数实现 private:private: 数据成员和成员函数实现数据成员和成员函数实现 ;2022-3-6.141.3.1 类的定义类的定义说明:说明:(1 1)定义一个类时,使用关键字)定义一个类时,使用关键字classclass;类名必须是一个合法的变;类名必须是一个合法的变量名,量名,C+C+中习惯用中习惯用C C或或T T开头,例如开头,例如CStudentCStuden

14、t;(2 2)一个类包括类头和类体两部分。)一个类包括类头和类体两部分。class class ,称为类头(,称为类头(class headclass head););(3 3)大括号中定义的是类的数据成员和成员函数,称为类体()大括号中定义的是类的数据成员和成员函数,称为类体(class bodyclass body)。类定义结束要用)。类定义结束要用“;”结束;结束;(4 4)关键字)关键字publicpublic(公有)、(公有)、 protectedprotected(保护)(保护) 和和privateprivate(私(私有)称为成员访问限定符(有)称为成员访问限定符(mumber

15、access specifiermumber access specifier)。用访)。用访问限定符声明了各个数据成员和成员函数的访问权限。问限定符声明了各个数据成员和成员函数的访问权限。2022-3-6.151.3.1 类的定义类的定义三、访问限定符三、访问限定符 n公有(公有(publicpublic):):提供了与外界的接口功能。公有成员可以被本类中的提供了与外界的接口功能。公有成员可以被本类中的成员使用和访问,还可以被类作用域内的其他外在其他函数使用。成员使用和访问,还可以被类作用域内的其他外在其他函数使用。n私有(私有(privateprivate):):封装在类内部的,只能被该类

16、的成员和该类友元函数封装在类内部的,只能被该类的成员和该类友元函数或友元类访问,任何类以外的函数对私有成员的访问都是非法的。或友元类访问,任何类以外的函数对私有成员的访问都是非法的。n保护(保护(protectedprotected:访问权限介于私有和公有中间,类的成员可以访问,:访问权限介于私有和公有中间,类的成员可以访问,类以外的其他函数不能访问保护成员。类以外的其他函数不能访问保护成员。 不同访问权限关系图不同访问权限关系图 类类Aclass外部外部私有成员私有成员private保护成员保护成员protected公有成员公有成员public继承类继承类友元友元class外部外部2022-

17、3-6.161.3.1 类的定义类的定义例:定义一个日期类例:定义一个日期类CdateCdateCdate-year : int-month :int-day : int+Setdate (y : int, m : int, d : int) : void+Isleapyear() : int+Print() : void 2022-3-6.17#include class Cdate /使用关键字使用关键字class声明一个类,类名为声明一个类,类名为Cdate public: /以下是公有成员函数以下是公有成员函数 void Setdate (int y, int m,int d)/设置日

18、期设置日期 year=y; month=m; day=d;/以上以上3行是函数的实现行是函数的实现int Isleapyear()/判断日期是不是闰年判断日期是不是闰年 return (year%4=0&year%100!=0)|(year%400=0); void Print() /定义一个公有成员函数定义一个公有成员函数Print()输出日期输出日期 coutyear- month -dayendl;private:/以下是私有成员以下是私有成员 int year,month ,day;/定义定义3个整型变量,分别表示日期的年月日个整型变量,分别表示日期的年月日;2022-3-6.

19、181.3.2 成员函数的定义成员函数的定义n类的成员函数也是函数的一种,它的与以前介绍的普通函数用类的成员函数也是函数的一种,它的与以前介绍的普通函数用法基本一样。法基本一样。n成员函数由函数头和函数体组成,函数头包括函数名、函数的成员函数由函数头和函数体组成,函数头包括函数名、函数的参数及函数的类型。函数体主要参数及函数的类型。函数体主要说明说明函数实现的功能。函数实现的功能。n成员函数与一般函数的区别在于:成员函数与一般函数的区别在于:它属于类的成员,出现在类它属于类的成员,出现在类体中,是类的一部分。使用类的成员函数时,要考虑类成员函体中,是类的一部分。使用类的成员函数时,要考虑类成员

20、函数的访问权限。数的访问权限。n类的成员函数可以在类体中定义,也可以在类体中声明类成员类的成员函数可以在类体中定义,也可以在类体中声明类成员函数,成员函数的实现在类外定义。函数,成员函数的实现在类外定义。.2022-3-6191 在类内定义成员函数在类内定义成员函数#include class Cdate public: void Setdate (int y, int m,int d) /在类内定义成员函数在类内定义成员函数 year=y; month=m; day=d; int Isleapyear()return (year%4=0&year%100!=0)|(year%400=

21、0); void Print()coutyear- month -dayendl;private: int year,month ,day; date1,date2,date3; ;说明:说明:在类内定义的成员函数默认的是内联函数(在类内定义的成员函数默认的是内联函数(inlineinline函数)。一般把规模比较小的成员函数函数)。一般把规模比较小的成员函数在类内定义。在类内定义。.2022-3-6202 在类外定义成员函数在类外定义成员函数 通常情况下通常情况下 C+C+程序员习惯在类体中只定义数据成程序员习惯在类体中只定义数据成员以及成员函数的声明,而将成员函数的实现写在类外。因员以及成

22、员函数的声明,而将成员函数的实现写在类外。因此类的定义由两部分组成:此类的定义由两部分组成:n声明部分声明部分 声明类的数据成员类型和成员函数的参数类型、个数以声明类的数据成员类型和成员函数的参数类型、个数以及返回值类型。及返回值类型。n实现部分实现部分 对说明类成员函数的具体实现对说明类成员函数的具体实现.2022-3-6212 在类外定义成员函数在类外定义成员函数一、定义的格式一、定义的格式 /类声明部分类声明部分class class 类名类名 public: private: Protected:public: private: Protected: 数据成员类型数据成员类型 数据成员

23、名;数据成员名; 数据成员类型数据成员类型 数据成员名;数据成员名; 函数类型函数类型 成员函数名(参数表)成员函数名(参数表); ; 函数类型函数类型 成员函数名(参数表)成员函数名(参数表); ; ;/类实现部分类实现部分函数类型函数类型 类名类名 :成员函数名(参数表):成员函数名(参数表) / /实现实现 .2022-3-6222 在类外定义成员函数在类外定义成员函数说明:说明:(1 1)在类声明部分,包括)在类声明部分,包括数据成员的定义和成员函数的声明数据成员的定义和成员函数的声明。(2 2)成员函数的声明主要说明函数的类型,函数的参数个数)成员函数的声明主要说明函数的类型,函数的

24、参数个数及类型,并用及类型,并用“;”结束。结束。(3 3)函数实现部分是对在类中定义的成员函数完成功能的实)函数实现部分是对在类中定义的成员函数完成功能的实现,包括函数头和函数体。在类体中直接定义函数时,不需要现,包括函数头和函数体。在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。但成员函数在类外定义时,必须在函数名前面加上类名,给与但成员函数在类外定义时,必须在函数名前面加上类名,给与限定限定(qualifed)(qualifed),“”是是作用域限定符作用域限定符(field qualifier

25、)(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。如果在作或称作用域运算符,用它声明函数是属于哪个类的。如果在作用域运算符用域运算符“”的前面没有类名,或者函数名前面既无类名的前面没有类名,或者函数名前面既无类名又无作用域运算符又无作用域运算符“”,则表示,则表示displaydisplay函数不属于任何类,函数不属于任何类,该函数不是成员函数,而是全局函数,即非成员函数的一般普该函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。通函数。.2022-3-6232 在类外定义成员函数在类外定义成员函数例:例:CdateCdate类定义类定义/ Cdate

26、类声明部分类声明部分class Cdate public: /函数声明函数声明 void Setdate (int y, int m,int d); /或或void Setdate (int, int,int); int Isleapyear(); void Print();private: int year,month ,day;date1,date2,date3; / Cdate类成员函数的实现类成员函数的实现void Cdate: Setdate (int y, int m,int d) year=y; month=m; day=d; int Cdate:Isleapyear() ret

27、urn (year%4=0&year%100!=0)|(year%400=0);void Cdate:Print() coutyear- month -dayendl;2022-3-6.241.3.3 类对象的定义类对象的定义 1 1先声明类类型,然后定义类对象先声明类类型,然后定义类对象class class 类名类名 数据成员和成员函数实现数据成员和成员函数实现; class class 类名类名 对象列表对象列表说明:说明:(1 1)class class 可选,可以写,也可以省略可选,可以写,也可以省略(2 2)类名是定义好的类。)类名是定义好的类。(3 3)对象列表的格式为:

28、对象名)对象列表的格式为:对象名 ,对象名,对象名,对象名,对象名 。定义多个对象。定义多个对象时,各对象名中间用逗号隔开。时,各对象名中间用逗号隔开。如:如: class Cdate date1,date2,date3; /Cdateclass Cdate date1,date2,date3; /Cdate是已经声明的类类型是已经声明的类类型 Cdate date1,date2,date3; /Cdate date1,date2,date3; /建议使用的方法。建议使用的方法。2022-3-6.252 2在声明类类型的同时定义对象在声明类类型的同时定义对象class class 类名类名 数

29、据成员和成员函数实现数据成员和成员函数实现 对象列表对象列表;例:例:#include class Cdate /使用关键字使用关键字class声明一个类,类名为声明一个类,类名为Cdate public: /以下是公有成员函数以下是公有成员函数 void Setdate (int y, int m,int d)/设置日期设置日期 year=y; month=m; day=d; /以上以上3行是函数的实现行是函数的实现 int Isleapyear()/判断日期是不是闰年判断日期是不是闰年 return (year%4=0&year%100!=0)|(year%400=0); void

30、 Print() /定义一个公有成员函数定义一个公有成员函数Print()输出日期输出日期 coutyear- month -day - 数据成员名数据成员名 / / “-”是指向运算符是指向运算符 对象指针名对象指针名 - - 成员函数名成员函数名 例如:例如: Cdate d,Cdate d,* *p; /p; /定义对象定义对象d d和对象指针变量和对象指针变量p p p=&d; / p=&d; /初始化对象指针初始化对象指针p p p- Print();/ p- Print();/通过指向对象的指针和指向运算符访问对象中的成员通过指向对象的指针和指向运算符访问对象中的成

31、员.2022-3-6281.3.4 对象成员的访问对象成员的访问(3 3)通过对象的引用变量访问对象中的成员)通过对象的引用变量访问对象中的成员 如果为一个对象定义了一个引用变量,它们是共占同一如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已。因此完全可以通过引用变量来访问该对象中的成员。通示而已。因此完全可以通过引用变量来访问该对象中的成员。通过对象的引用变量访问该对象中的成员的格式与通过对象名访问过对象的引用变量访问该对象中的成员的格式与通过对象名访问对象中的成员的形式一样

32、。对象中的成员的形式一样。 例如:例如: Cdate d1; /Cdate d1; /定义对象定义对象d1d1 Cdate & d2=d1; / Cdate & d2=d1; /定义引用变量定义引用变量d2d2,并初始化之为,并初始化之为d1d1 d2. Print(); / d2. Print(); /引用变量访问对象中的成员,输出日期引用变量访问对象中的成员,输出日期.2022-3-629/ Cdate.h 在头文件中声明日期类在头文件中声明日期类class Cdate public: void Setdate (int y, int m,int d); int Islea

33、pyear(); void Print();private: int year,month ,day; /Cdate.cpp 在与类定义头文件同名的在与类定义头文件同名的cpp文件中定义成员函文件中定义成员函数实现部分数实现部分#include #include Cdate.h /包含类定义的头文件,否则出错包含类定义的头文件,否则出错void Cdate: Setdate (int y, int m,int d) year=y; month=m; day=d; int Cdate:Isleapyear() return (year%4=0&year%100!=0)|(year%400

34、=0);void Cdate:Print() coutyear- month -day Setdate(2000,4,2); /通过指针访问成员通过指针访问成员 d4. Setdate(2006,12,1); /通过引用访问成员通过引用访问成员 d1.Print(); p- Print(); d4.Print();【例例1.11.1】一个完整的一个完整的CdateCdate类的应用程序。类的应用程序。程序运行结果:程序运行结果:1999-12-302000-4-22006-12-1.2022-3-630d1.Setdate(1999,12,30) &d2yearmonth dayyea

35、r = 1999month =12day = 13yearmonth dayd1d2d4d3pp- Setdate(2000,4,2)yearmonth dayyear = 2000month =4day = 2year = 2006month =12day = 1d4.Setdate(2006,12,1). Setdate(2006,12,1);d1.Print()d4.Print()p- Print()屏幕输出结果:1999-12-302000-4-22006-12-1定义变量并为定义变量并为变量分配空间变量分配空间调用类成员函数调用类成员函数Setdate()初始()初始化类的数据成员化

36、类的数据成员调用类成员函数调用类成员函数Print()输出()输出日期日期 例例1.11.1程序执行过程程序执行过程 .2022-3-631【例例1.21.2】封装一个学生类,学生的信息包括学生的姓名、学号、性别、年龄和封装一个学生类,学生的信息包括学生的姓名、学号、性别、年龄和3 3门的成绩。可以设置学生的各类信息,统计该学生的平均成绩并输出学生信息。门的成绩。可以设置学生的各类信息,统计该学生的平均成绩并输出学生信息。 CStudent-name20 : char-id : int -sex : char-age : int-grad3 : float+setinfo(na : char

37、*,i : int ,s : char, a : int) : void+void setgrad(a : float , b : float , c : float) : void+avg() : float+display() : voidCstudentCstudent的类图的类图 .2022-3-632/CStudent.h 这是头文件,在此文件中进行类的这是头文件,在此文件中进行类的声明声明class CStudent /类声明类声明 public:void setinfo(char *,int ,char,int);void setgrad(float , float , floa

38、t);float avg();void display(); private:char name20;int id ;char sex;int age;float grad3; ;/CStudent.cpp在此文件中进行函数的定义在此文件中进行函数的定义#include #include #include CStudent.h/漏写此行编译通不过漏写此行编译通不过void CStudent:setinfo(char *na,int i ,char s ,int a) strcpy(name,na);id=i;sex=s;age=a;void CStudent:setgrad(float a,

39、float b, float c)grad0=a;grad1=b;grad2=c;float CStudent:avg()return (grad0+ grad1 +grad2)/3;void CStudent:display( ) coutid:idendl; coutname:nameendl; coutsex:sexendl; coutage:ageendl; /main.cpp 主函数模块主函数模块#include #include CStudent.h/将类声明头文件包含进来将类声明头文件包含进来int main( )CStudent stud1;/定义对象定义对象stud1. se

40、tinfo(张三张三,2006102,m,18);stud1.setgrad(79,98,87);stud1.display();cout 平均成绩:平均成绩:stud1.avg();return 0;运行结果:运行结果:id:name:张三:张三sex:mage:18平均成绩:平均成绩:882022-3-6.331.3.5 类对象的内存分配类对象的内存分配 C+ C+中用同一内存空间来存放这个同种类对象的成员函中用同一内存空间来存放这个同种类对象的成员函数代码,当去调用某个对象的成员函数时,都去调用这个公用数代码,当去调用某个对象的成员函数时,都去调用这个公用的函数代码。的函数代码。C+C+

41、中用中用thisthis指针指针来区分是哪个对象的成员函数。来区分是哪个对象的成员函数。 数据成员数据成员对象对象1数据成员数据成员对象对象2数据成员数据成员对象对象n公用成员函数代码公用成员函数代码.2022-3-6341.3.6 this指针 一、问题的提出一、问题的提出 每个对象中的数据成员都分别占有存储空间,而成员函数都是同每个对象中的数据成员都分别占有存储空间,而成员函数都是同一代码段。如果对同一个类定义了一代码段。如果对同一个类定义了n n个对象,那么,当不同对象的成员函个对象,那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的数据成员是属于哪个对象呢?数引用数据成员时,怎

42、么能保证引用的数据成员是属于哪个对象呢? 二、二、thisthis指针指针nC+C+除了接受原有的参数外,还隐含的接受了一个特殊的指针参数,这个除了接受原有的参数外,还隐含的接受了一个特殊的指针参数,这个指针称为指针称为thisthis指针指针。n它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址,既起始地址,既thisthis指针指向当前对象。指针指向当前对象。.2022-3-635【例例1.13】设计矩形类设计矩形类CRect,说明,说明this指针的用法。指针的用法。分析:矩形类数据成员包括左上角坐标(

43、分析:矩形类数据成员包括左上角坐标(left和和top)和矩形的长()和矩形的长(length)和)和宽(宽(width),定义成员函数),定义成员函数set()设置矩形,成员函数设置矩形,成员函数area()计算矩形的面积。计算矩形的面积。#include class CRectpublic: CRect( ); void set( double t, double, double len, double wid); double area();private: double left; double top; double length; double width; CRect:CRect

44、() top = 0; /相当与相当与this-top=0 left = 0; length = 0; width = 0; .2022-3-636void CRect:set(double t, double lef, double len, double wid )top = t; left = lef;length = len;width = wid; double CRect:area()return length* width; void main()CRect r1,r2; r1.set ( 10,10,10,10); r2.set ( 200,200,15,25); cout第一

45、矩形的面积是第一矩形的面积是:r1.area()endl;cout第二矩形的面积是第二矩形的面积是:r2.area()top=t; left = lef;/等价与等价与this- left = lef; length = len;/等价与等价与this- length = len; width = wid;/等价与等价与this- width = wid; 2022-3-6.371.5 类和类和对象的进一步引用对象的进一步引用 在程序中经常需要访问对象中的成员,访问对象中在程序中经常需要访问对象中的成员,访问对象中的成员可以有的成员可以有3 3种方法:种方法:n 通过通过对象名和成员运算符对象

46、名和成员运算符访问对象中的成员;访问对象中的成员;n 通过通过指向对象的指针和指针运算符指向对象的指针和指针运算符访问对象中的成员;访问对象中的成员;n 通过通过对象的引用变量对象的引用变量访问对象中的成员。访问对象中的成员。2022-3-6.381.4 构造函数和析构函数构造函数和析构函数构造函数和析构函数的作用构造函数和析构函数的作用1. 1. 构造(构造(constructorconstructor)函数)函数 在创建对象时,系统自动调用它来初始化数据成员;在创建对象时,系统自动调用它来初始化数据成员;2. 2. 析构(析构(destructordestructor)函数)函数 在对象生

47、存期结束的时候,自动调用来释放该对象。在对象生存期结束的时候,自动调用来释放该对象。2022-3-6.391.4.1 构造函数的定义一、构造函数的定义格式:一、构造函数的定义格式:class class 类名类名 publicpublic: 构造函数函数名(参数表);构造函数函数名(参数表); ;2022-3-6.401.4.1 构造函数的定义二、构造函数的特点二、构造函数的特点(1 1)构造函数是类的一个特殊的成员函数,构造函数是类的一个特殊的成员函数,函数名与类名相同函数名与类名相同;(2 2)构造函数的访问属性应该是)构造函数的访问属性应该是公有(公有(publicpublic)访问属性

48、;访问属性;(3 3)构造函数的功能是对对象进行初始化,因此在构造函数中)构造函数的功能是对对象进行初始化,因此在构造函数中只能对数据只能对数据成员做初始化成员做初始化,这些数据成员一般为私有成员,在构造函数中一般不做,这些数据成员一般为私有成员,在构造函数中一般不做初始化以外的事情;初始化以外的事情;(4 4)构造函数可以在类内定义也可以在类外定义;)构造函数可以在类内定义也可以在类外定义;(5 5)构造函数)构造函数无函数返回类型无函数返回类型。注意:是什么也不写,也不可写。注意:是什么也不写,也不可写voidvoid;(6 6)在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动

49、)在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也被调用,在该对象生存期中也只调用这一次只调用这一次。(7 7)构造函数可以重载构造函数可以重载。类中可以有多个构造函数,它们由不同的参数表。类中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。区分,系统在自动调用时按一般函数重载的规则选一个执行。2022-3-6.41【例例1.31.3】定义定义CdateCdate一个不带参数的构造函数。一个不带参数的构造函数。#include class Cdate /定义定义一个一个日期类日期类 public:/公有数据成员公

50、有数据成员 Cdate() /定义构造函数定义构造函数 year=2000;/初始化数据成员初始化数据成员 month=1; day=1; void Print()/一般成员函数一般成员函数 coutyear- month -dayendl; private: int year,month ,day; int main() Cdate d1; /自动调用构造函数,初始化数据成员自动调用构造函数,初始化数据成员 d1.Print(); return 0;程序运行结果为:程序运行结果为:2000-1-1 2022-3-6.42【例例1.41.4】CdateCdate类带参数的构造函数类带参数的构造

51、函数 #include class Cdatepublic: Cdate(int y, int m,int d); void Print();private: int year,month ,day;Cdate:Cdate(int y, int m,int d) year=y; month=m; day=d;void Cdate:Print() coutyear- month -dayendl;int main() Cdate d1(1999,12,30),d2(2001,4,1); d1.Print(); d2.Print(); return 0;程序运行结果:1999-12-302001-

52、4-12022-3-6.43三、使用初始化表来实现对数据成员的初始化三、使用初始化表来实现对数据成员的初始化初始化表的一般格式:初始化表的一般格式:类名类名:构造函数名构造函数名( (参数列表参数列表):):初始化表初始化表 构造函数其他实现代码构造函数其他实现代码 初始化表的格式:初始化表的格式: 对象成员对象成员1(1(参数名或常量参数名或常量) ),对象成员,对象成员2(2(参数名或常量参数名或常量) ),对象成对象成员员n(n(参数名或常量参数名或常量) )例如例例如例1.41.4定义的构造函数可以改用以下形式:定义的构造函数可以改用以下形式:Cdate: Cdate(int y, i

53、nt m,int d): year(y), month(m),day(d) Cdate: Cdate(int y, int m,int d): year(y), month(m),day(d) 注意:注意:这种写法方便、简洁。许多这种写法方便、简洁。许多C+C+程序员喜欢用这种方式初始化所有的数据成员。除了构造函程序员喜欢用这种方式初始化所有的数据成员。除了构造函数可以使用初始化表外,类的其他成员函数也可以根据需要使用初始化表。数可以使用初始化表外,类的其他成员函数也可以根据需要使用初始化表。2022-3-6.441.4.2 构造函数的重载构造函数的重载 程序中需要以不同的方式初始化类对象时,

54、可以在一个类中程序中需要以不同的方式初始化类对象时,可以在一个类中定义多个构造函数。即可以重载构造函数。定义多个构造函数。即可以重载构造函数。C+C+定义对象时,根定义对象时,根据声明中的据声明中的参数个数和类型参数个数和类型选择相应的构造函数初始化对象选择相应的构造函数初始化对象。2022-3-6.45【例例1.51.5】CdateCdate类中的重载构造函数类中的重载构造函数 #include class Cdatepublic: Cdate(); /不带参数的构造函数,又称默认构造函数不带参数的构造函数,又称默认构造函数 Cdate(int y);/带带1个参数的构造函数个参数的构造函数

55、 Cdate(int y, int m); /带带2个参数的构造函数个参数的构造函数 Cdate(int y, int m,int d); /带带3个参数的构造函数个参数的构造函数 void Print();private: int year,month ,day;Cdate: Cdate()/构造函数的定义构造函数的定义 year=2000; month=1; day=1;Cdate: Cdate(int y) year=y; month=1; day=1;Cdate: Cdate(int y, int m) year=y; month=m; day=1;Cdate: Cdate(int y

56、, int m,int d) year=y; month=m; day=d;void Cdate:Print() coutyear- month -dayendl;int main() Cdate day1; Cdate day2(2004); Cdate day3(2005,2); Cdate day4(2006,12,16); day1.Print(); day2.Print(); day3.Print(); day4.Print(); return 0;程序运行结果:2000-1-12004-1-12005-2-12006-12-162022-3-6.461.4.2 构造函数的重载构造函

57、数的重载关于构造函数关于构造函数C+C+规定:规定:(1 1)每个类)每个类必须有一个构造函数必须有一个构造函数,如果没有就不能创建任何对象;,如果没有就不能创建任何对象;(2 2)若没有定义任何一个构造函数,)若没有定义任何一个构造函数,C+C+提供一个默认的构造函数,提供一个默认的构造函数,该构造函数没有参数,不做任何工作,相当一个空函数,例如:该构造函数没有参数,不做任何工作,相当一个空函数,例如: Cdate:CdateCdate:Cdate()() 所以在讲构造函数以前也可以定义一个对象,就所以在讲构造函数以前也可以定义一个对象,就是因为系统提供的默认构造函数。是因为系统提供的默认构

58、造函数。(3 3)只要)只要C+C+提供一个构造函数(不一定是没有参数的),提供一个构造函数(不一定是没有参数的),C+C+不再不再提供默认的构造函数。也就是说为类定义了一个带参数的构造提供默认的构造函数。也就是说为类定义了一个带参数的构造函数,还想要创建无参的对象时,则需要自己定义一个默认构函数,还想要创建无参的对象时,则需要自己定义一个默认构造函数造函数 2022-3-6.471.4.3 默认参数的构造函数默认参数的构造函数为什么使用默认参数的构造函数:对象常有一些初始值。为什么使用默认参数的构造函数:对象常有一些初始值。【例例1.61.6】设计设计CPointCPoint类,它带有默认参

59、数的构造函数。类,它带有默认参数的构造函数。分析:一个点包括横坐标(分析:一个点包括横坐标(x x)和纵坐标()和纵坐标(y y)两个数据成员)两个数据成员, , 默认初始值为默认初始值为(0,00,0)。也可以根据用户需要,初始化点为其他坐标,因此需要定义一个)。也可以根据用户需要,初始化点为其他坐标,因此需要定义一个带默认参数的构造函数。定义成员函数带默认参数的构造函数。定义成员函数print()print()输出该点。输出该点。CPoint-x : double-y : double+CPoint(x1 : double =0,y1 : double =0)+print() : void

60、CPoint类图类图 2022-3-6.48#include class CPointpublic: CPoint (double x1=0,double y1=0)/带默认参数的构造函数带默认参数的构造函数 x=x1; y=y1; void print () cout(x,y)endl;private: double x,y;main() CPoint point1; /自动调用带默认参数的构造函数,(自动调用带默认参数的构造函数,(0,0) CPoint point2(10);/自动调用带默认参数的构造函数,(自动调用带默认参数的构造函数,(10,0) CPoint point3(20,30);/自动调用带默认参数的构造函数,(自动调用带默认参数的构造函数,(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论