《c程序设计基础》第七章-类和对象_第1页
《c程序设计基础》第七章-类和对象_第2页
《c程序设计基础》第七章-类和对象_第3页
《c程序设计基础》第七章-类和对象_第4页
《c程序设计基础》第七章-类和对象_第5页
已阅读5页,还剩173页未读 继续免费阅读

下载本文档

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

文档简介

1、C+程序设计基础程序设计基础第第7 7章章 类与对象类与对象北京邮电大学信通院北京邮电大学信通院方莉方莉2第第7 7章章 类与对象类与对象v类类是实现是实现C+C+面向对象程序设计的基础。面向对象程序设计的基础。v面向对象程序设计的基本特点有:面向对象程序设计的基本特点有:抽象、封装、抽象、封装、继承和多态。继承和多态。v类类把把数据和函数数据和函数封装在一起,是封装在一起,是C+C+封装的基本封装的基本单元。单元。v本章主要内容本章主要内容 类的使用、定义和实现类的使用、定义和实现 面向对象分析和面向对象设计面向对象分析和面向对象设计7.1 7.1 类和对象的定义类和对象的定义7.2 7.2

2、 对象的使用对象的使用7.3 7.3 构造函数构造函数7.4 7.4 析构函数析构函数 7.5 7.5 类的静态成员类的静态成员 7.6 7.6 类成员的保护和使用类成员的保护和使用7.7 7.7 运算符重载运算符重载 7.8 7.8 类的组合类的组合7.9 7.9 面向对象分析和设计面向对象分析和设计第第7 7章章 类与对象类与对象47.1 7.1 类和对象的定义类和对象的定义v一个一个类类表示现实生活中的一类事物,比如表示现实生活中的一类事物,比如“学学生生”, 事物有相应的特征或属性,它们就是类的事物有相应的特征或属性,它们就是类的数据成员数据成员; 事物可能有行为动作,也可能被某些行为

3、动作所操作,事物可能有行为动作,也可能被某些行为动作所操作,这些都用函数来实现,这些函数和类有着不可分割的关这些都用函数来实现,这些函数和类有着不可分割的关系,是构成类的函数成员,或者叫系,是构成类的函数成员,或者叫成员函数成员函数。v在在C+C+中,中,类类实际上相当于一种实际上相当于一种用户自定义的数用户自定义的数据类型据类型。 5v在定义了类类型后,就可以定义该类型的变在定义了类类型后,就可以定义该类型的变量,这个变量就称为量,这个变量就称为类的对象类的对象(或实例)。(或实例)。v对象对象是一类事物中的一个具体的个体。是一类事物中的一个具体的个体。v从程序设计的角度来看,从程序设计的角

4、度来看,对象就相当于变量。对象就相当于变量。 7.1 7.1 类和对象的定义类和对象的定义6v举例:举例:class Student /类的定义类的定义private:int id;char20 name;int age;float score;public:void getscore()void printstu(); 7.1 7.1 类和对象的定义类和对象的定义77.1.1 7.1.1 使用类对象使用类对象v 如果已经知道某个类的功能和接口函数,就可以使用它了。如果已经知道某个类的功能和接口函数,就可以使用它了。先先定义类对象定义类对象,通过对象,通过对象调用接口函数调用接口函数实现一定的

5、功能。实现一定的功能。class Student stu01; /class也可以省略不写也可以省略不写 Student stu01;stu01.getscore();stu01.printstu(); v 这个过程的本质是:根据对象所需要完成的任务,向对象这个过程的本质是:根据对象所需要完成的任务,向对象发送消息。对象收到消息后,调用接口中的相应的函数,发送消息。对象收到消息后,调用接口中的相应的函数,完成它的功能。对象只需要知道完成它的功能。对象只需要知道“做什么做什么”,具体工作由,具体工作由成员函数来完成。成员函数来完成。 8classclass Student / Student /

6、类的定义类的定义 private:private: int id; int id; char name 20; char name 20; float score; float score; public:public:void GetData();void GetData();void PrintData();void PrintData(); ; v 类的声明类的声明: :具体说明类的组成具体说明类的组成classclass 类名类名 private:private: / /数据成员数据成员protected:protected: / /保护成员保护成员public:public: / /

7、成员函数成员函数; ; 一般写在类的一般写在类的. .h h文件中,也可以写文件中,也可以写在类的在类的. .cppcpp文件之首。文件之首。7.1.2 7.1.2 类的声明类的声明9v类实际上是一种类实际上是一种用户自定义的数据类型用户自定义的数据类型。 比较比较: :struct studentstruct student int id;int id;char20 name;char20 name;float score;float score; ;class Studentclass Student private: private:int id;int id;char name20;c

8、har name20; float score;float score;public:public:void GetData();void GetData();void PrintData();void PrintData(); ; 同是自定义的类型。同是自定义的类型。在无显式声明时,结构在无显式声明时,结构体的成员是体的成员是公公有的,类的有的,类的成员是成员是私私有的。有的。7.1.2 7.1.2 类的声明类的声明10分析分析: : 任何一个时钟应该有任何一个时钟应该有时、分、秒时、分、秒的值,这就是时钟的的值,这就是时钟的属性特征;时钟的操作应该有属性特征;时钟的操作应该有设置时间、显示

9、时间设置时间、显示时间等。画出等。画出时钟类的标记图如下:时钟类的标记图如下: 例例: : 要声明一个时钟类要声明一个时钟类11v举例举例: :class Clock public:void SetTime(int newH,int newM,int newS);void ShowTime(); private:int Hour;int Minute;int Second;7.1.2 7.1.2 类的声明类的声明12v举例举例: :class Point public: void SetXY(int x, int y); void GetXY(int &x, int &y);

10、private: int m_x; int m_y;7.1.2 7.1.2 类的声明类的声明13v关键字关键字publicpublic、protectedprotected、privateprivate说明类成员的访说明类成员的访问控制属性。问控制属性。 私有私有(privateprivate)成员成员只允许只允许本类的成员函数本类的成员函数来访问;来访问; 公有公有(publicpublic)成员成员是类对外的接口,在类声明和类(函是类对外的接口,在类声明和类(函数)实现之后,类的对象可以访问公有成员。数)实现之后,类的对象可以访问公有成员。 保护型保护型(protectedprotecte

11、d)成员,对于类外其它函数,其可访成员,对于类外其它函数,其可访问性和私有成员的性质相似。问性和私有成员的性质相似。 7.1.2 7.1.2 类的声明类的声明14关于访问控制属性,注意关于访问控制属性,注意:v 在类声明中,三种访问控制属性,可以按在类声明中,三种访问控制属性,可以按任意次序出现任意次序出现,也,也可以可以不出现不出现。publicpublic等关键字也可以等关键字也可以多次出现多次出现,但是,但是一个成一个成员只能具有一种访问控制属性员只能具有一种访问控制属性。v 如果不写访问控制属性关键字,默认的是如果不写访问控制属性关键字,默认的是privateprivate。在书写时在

12、书写时通常习惯将通常习惯将公有类型放在最前面公有类型放在最前面,这样便于阅读,因为它们,这样便于阅读,因为它们是外部访问时所要了解的。是外部访问时所要了解的。v 一般情况下,一个一般情况下,一个类的数据成员类的数据成员应该声明为应该声明为私有私有成员,这样成员,这样封装性较好。一个类应该有一些封装性较好。一个类应该有一些公有的函数成员公有的函数成员,作为对外,作为对外的接口,否则别的代码无法访问类。的接口,否则别的代码无法访问类。 7.1.2 7.1.2 类的声明类的声明15v“类的成员类的成员”既可以是既可以是数据成员数据成员,也可以是,也可以是成员函成员函数的原型。数的原型。 数据成员数据

13、成员,表示类的属性,声明方式与一般变量相同。表示类的属性,声明方式与一般变量相同。 成员函数成员函数,描述类的对象可以进行的操作,一般在类中描述类的对象可以进行的操作,一般在类中声明原型,在声明原型,在类声明之外定义函数的具体实现类声明之外定义函数的具体实现。 7.1.2 7.1.2 类的声明类的声明16v类的类的成员函数成员函数描述的是类的行为或操作。描述的是类的行为或操作。 在在类声明类声明中,声明函数的原型。中,声明函数的原型。( (类的声明文件类的声明文件.h.h文件文件) ) 函数的函数的具体实现具体实现一般写在类声明之外。一般写在类声明之外。( (类的实现文类的实现文件件.cpp.

14、cpp文件文件) )v在类的外部定义成员函数的语法形式为:在类的外部定义成员函数的语法形式为:返回值类型返回值类型 类名类名: :成员函数名成员函数名( (参数表参数表) ) 函数体函数体 7.1.3 7.1.3 类的成员函数类的成员函数17例例: : 时钟类时钟类ClockClock的成员函数的实现的成员函数的实现: :void Clock:SetTime(int newH,int newM,int newS) Hour=newH;Minute=newM;Second=newS;void Clock:ShowTime() coutHour:Minute:Secondendl; 7.1.3 7

15、.1.3 类的成员函数类的成员函数18class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second;void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock:ShowTime() coutHour“:”Minute“:”Secondendl; ClockClock类的声明和实现类的声明和实现19

16、v成员函数描述类的行为(或服务、操作);实现程成员函数描述类的行为(或服务、操作);实现程序的算法,是对类封装的数据进行操作的唯一途径。序的算法,是对类封装的数据进行操作的唯一途径。v在在类定义中说明原型类定义中说明原型( (一般在一般在. .h h文件中文件中) ),在,在类的实现类的实现文件文件(. (.cpp)cpp)中中定义函数体定义函数体,并在函数名前使用类名加,并在函数名前使用类名加以限定以限定, ,标示它与类之间的关系。也可以直接在类中标示它与类之间的关系。也可以直接在类中定义函数体,形成定义函数体,形成内联成员函数内联成员函数。v允许定义允许定义重载函数重载函数和和带缺省形参值

17、带缺省形参值的成员函数。的成员函数。v在声明成员函数时,可以控制访问权限;一般将在声明成员函数时,可以控制访问权限;一般将成成员函数设为公有型员函数设为公有型的。的。7.1.3 7.1.3 类的成员函数类的成员函数20/ /Tdate.h Tdate.h 类的声明文件类的声明文件class class TdateTdate public:public: void Set(int m,int d,int y); void Set(int m,int d,int y); / /置日期值置日期值 int IsLeapYear(); int IsLeapYear(); / /判是否闰年判是否闰年 vo

18、id Print(); void Print(); / /输出日期值输出日期值private:private: int month; int month; int day; int day; int year; int year; ;21/ /Tdate.cpp Tdate.cpp 类的实现文件类的实现文件void Tdate:Set(int m,int d,int y)void Tdate:Set(int m,int d,int y) month=m; day=d; year=y; month=m; day=d; year=y; int Tdate: IsLeapYear() int Tda

19、te: IsLeapYear() return (year%4=0&year%100!=0)|(year%400=0); return (year%4=0&year%100!=0)|(year%400=0); void Tdate: Print() void Tdate: Print() cout month / day / year endl; cout month / day / year endl; 22v内联函数:内联函数: 如果在如果在类的内部类的内部定义成员函数的具体实现,则该成员函定义成员函数的具体实现,则该成员函数为数为内联成员函数内联成员函数。 函数定义时没有

20、任何的附加说明,所以称为函数定义时没有任何的附加说明,所以称为隐式隐式声明的声明的内联成员。内联成员。 显示内联函数显示内联函数 ( (用用 inline)inline)7.1.3 7.1.3 类的成员函数类的成员函数23class Point public: void SetXY(int x, int y) m_x=x; m_y=y; void GetXY(int &x, int &y) x=m_x; y=m_y; private: int m_x; int m_y;7.1.3 7.1.3 类的成员函数类的成员函数24class Clock public: void SetT

21、ime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second;inline void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;inline void Clock:ShowTime() coutHour“:”Minute“:”Secondendl; 显式声明的显式声明的内联函数内联函数7.1.3 7.1.3 类的成员函数类的成员函数25v带默认参数值的成员函数带默认参

22、数值的成员函数 类的成员函数也可以有默认形参值,其调用规则类的成员函数也可以有默认形参值,其调用规则同普通函数相同。同普通函数相同。v例如时钟类的例如时钟类的SetTimeSetTime() ()函数,使用默认值:函数,使用默认值:void Clock:SetTime(int newH=0,int newM=0, int newS=0) Hour=newH;Minute=newM;Second=newS; 7.1.3 7.1.3 类的成员函数类的成员函数26v重载函数重载函数 成员函数可以用与普通函数同样的方法成员函数可以用与普通函数同样的方法重载重载。例例: :class Point pub

23、lic: void Set(int x, int y); void Set(int x, int y,int color); void Get(int &x, int &y); void Get(int &x, int &y, int &color); private: int m_x; int m_y; int m_color; ;7.1.3 7.1.3 类的成员函数类的成员函数27v 注意,注意,类名是成员函数名的一部分类名是成员函数名的一部分,所以一个类的成员函数,所以一个类的成员函数与另一个类的成员函数即使同名,也与另一个类的成员函数即使同名,也

24、不能认为是重载不能认为是重载。 class Clock public: void Set (int NewH, int NewM, int NewS); void Show ( ); private: int Hour, Minute, Second;class Point public: void Set(int x, int y); void Get(int &x, int &y); private: int m_x; int m_y;7.1.3 7.1.3 类的成员函数类的成员函数28v对象是一类事物中的个体,从程序设计的角度来对象是一类事物中的个体,从程序设计的角度来看

25、,看,对象就相当于变量对象就相当于变量。v定义一个对象和定义一个一般变量相同。定义一个对象和定义一个一般变量相同。 类名称类名称 对象名称对象名称例例 Clock ck1;Clock ck1; Point point1; Point point1; 7.1.4 7.1.4 对象对象29v定义变量时要分配存储空间,同样,定义变量时要分配存储空间,同样,定义一个对象定义一个对象时要分配存储空间时要分配存储空间,一个,一个对象所占的内存空间对象所占的内存空间是类是类的的数据成员所占的空间总和数据成员所占的空间总和。类的成员函数存放在。类的成员函数存放在代码区,不占内存空间。代码区,不占内存空间。v类

26、的成员是抽象的,对象的成员才是具体的。类的类的成员是抽象的,对象的成员才是具体的。类的数据成员都不会有具体的属性值。只有对象的成员数据成员都不会有具体的属性值。只有对象的成员才会有具体的属性值。才会有具体的属性值。7.1.4 7.1.4 对象对象30v对象的使用对象的使用: :根据类的功能和接口函数,定义对象,根据类的功能和接口函数,定义对象,通过对象调用接口函数实现一定的功能。通过对象调用接口函数实现一定的功能。v声明了类及其对象,在类的外部(即在类定义和成声明了类及其对象,在类的外部(即在类定义和成员函数的实现代码之外),就可以员函数的实现代码之外),就可以访问对象的公有访问对象的公有成员

27、成员(包括数据成员和函数成员)了。(包括数据成员和函数成员)了。v语法形式为语法形式为: :对象名对象名. 公有数据成员公有数据成员对象名对象名. .公有成员函数名公有成员函数名( (参数表参数表) ) 7.1.4 7.1.4 对象对象31v使用对象的过程:使用对象的过程: 根据对象所需要完成的任务,根据对象所需要完成的任务,向对象发送消息。向对象发送消息。 对象收到消息后,调用接口对象收到消息后,调用接口中的相应的函数,完成它的中的相应的函数,完成它的功能。功能。 对象只需要知道对象只需要知道“做什么做什么”,具体工作由成员函数来完成。具体工作由成员函数来完成。例例: : class stu

28、dent stu1;class student stu1; 或或 student stu1;student stu1; stu1.GetData(); stu1.GetData(); stu1.PrintData(); stu1.PrintData(); 7.1.4 7.1.4 对象对象classclass Student / Student /类的定义类的定义 private:private: int id; int id; char name 20; char name 20; float score; float score; public:public:void GetData();v

29、oid GetData();void PrintData();void PrintData(); ; 32例如,在主函数中定义了例如,在主函数中定义了ClockClock类的对象:类的对象:void main()void main() Clock myclock; Clock myclock; myclock.SetTime(12, 5, 0); myclock.SetTime(12, 5, 0); myclock.ShowTime(); myclock.ShowTime(); 返回地址参数0操作系统运行状态512main()栈区.myclock HourMinuteSecond执行执行mai

30、n()main()函数时的内存分配情况函数时的内存分配情况 33v 在类的在类的外部外部,只能通过对象访问类的,只能通过对象访问类的公有成员公有成员;在类的成员;在类的成员函数函数内部内部,可以直接访问类的,可以直接访问类的所有成员所有成员,这就实现了,这就实现了对访问对访问范围的有效控制范围的有效控制。 void Clock:SetTime(void Clock:SetTime( int newH=0, int newH=0, int newM=0, int newM=0, int newS=0) int newS=0) Hour=newH;Hour=newH;minute=newM;min

31、ute=newM;Second=newS;Second=newS; class Clockclass Clock public: public: void Set (int NewH, void Set (int NewH, int NewM, int NewS);int NewM, int NewS); void Show ( ); void Show ( ); private: private: int Hour, int Hour, Minute, Minute, Second; Second; ;void main()void main() Clock myclock; Clock m

32、yclock; myclock.SetTime(12,5, 0); myclock.SetTime(12,5, 0); myclock.ShowTime(); myclock.ShowTime(); 7.1.4 7.1.4 对象对象34v类作用域类作用域是指类定义和相应的成员函数定义的是指类定义和相应的成员函数定义的范围,通俗地称为类的内部。范围,通俗地称为类的内部。v一个类的全部成员都是一个整体的相关部分。一个类的全部成员都是一个整体的相关部分。v一个类的一个类的所有成员所有成员位于这个位于这个类的作用域类的作用域内,在内,在该范围内,一个该范围内,一个类的成员函数类的成员函数对本类的其它成

33、对本类的其它成员具有员具有无限制的访问权无限制的访问权。 7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性35例:编程测试类的作用域范例:编程测试类的作用域范围。围。#include using namespace std;class Sample private:int a;void fa(); protected:float b;void fb();public:char c;void set();void display();7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性36void Sample:fa() cout In function faendl;cou

34、ta b cendl;void Sample:fb() cout In function fbendl;couta b cendl;7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性37void Sample:set() a=10;b=5.5;c=K;void Sample:display() cout In function displayendl;fa();在类的成员函数里,在类的成员函数里,可以访问类的任何可以访问类的任何成员成员7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性38void main()void main() Sample s;Sample s;/

35、/ s.a=10; /s.a=10; /编译时会出错,在类的外部不能访问类的私有成员编译时会出错,在类的外部不能访问类的私有成员/ / s.b=5.5;/s.b=5.5;/编译时会出错,在类的外部不能访问类的保护成员编译时会出错,在类的外部不能访问类的保护成员s.c=K;s.c=K;s.set();s.set();/ / s.fa();/s.fa();/编译时会出错,在类的外部不能访问类的私有成员编译时会出错,在类的外部不能访问类的私有成员/ / s.fb();/s.fb();/编译时会出错,在类的外部不能访问类的保护成员编译时会出错,在类的外部不能访问类的保护成员s.display();s.

36、display(); 7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性39v类名实际是个类型名类名实际是个类型名,允许类名与其它变量名或,允许类名与其它变量名或函数名相同。函数名相同。v在类的内部,外部与类名同名的全局变量名或函在类的内部,外部与类名同名的全局变量名或函数名不可见。数名不可见。v在一个在一个函数内函数内,同名的,同名的类名和变量名类名和变量名可以同时使可以同时使用,都是可见的。用,都是可见的。7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性40例例: :若若SampleSample类已定义,以下函数的定义是没有问题的:类已定义,以下函数的定义是没有问题的

37、:void func( ) class class Sample Sample a; /a; /定义对象时要用到类名,加前缀定义对象时要用到类名,加前缀classclass int int SampleSample=10; /=10; /变量名和类名相同变量名和类名相同 Sample+; Sample+; /. /.v但是从程序可读性考虑,一般还是但是从程序可读性考虑,一般还是不要让类名和其不要让类名和其他变量名、函数名用同样的名字他变量名、函数名用同样的名字。7.1.5 7.1.5 类的作用域与可见性类的作用域与可见性41v要声明一个时钟类,任何一个时钟都应该有时、要声明一个时钟类,任何一个

38、时钟都应该有时、分、秒的值,这就是时钟的属性特征;时钟的操分、秒的值,这就是时钟的属性特征;时钟的操作应该有设置时间、显示时间等。作应该有设置时间、显示时间等。 7.1.6 7.1.6 时钟类举例时钟类举例42/声明时钟类的头文件:声明时钟类的头文件:#include using namespace std;class Clock/类的声明类的声明public: void SetTime(int newH=0,int newM=0,int newS=0); void ShowTime(); void ShowTime(int n); private: int Hour; int Minute;

39、 int Second; 7.1.6 7.1.6 时钟类举例时钟类举例43/实现类成员函数的源文件:实现类成员函数的源文件:#include Clock.hvoid Clock:SetTime(int newH,int newM,int newS)/SetTime()函数定义函数定义 Hour=newH; Minute=newM; Second=newS;void Clock:ShowTime()/ShowTime()函数定义函数定义 coutHour:Minute:Secondendl;void Clock:ShowTime(int n)/重载函数的定义重载函数的定义 coutHour点点M

40、inute分分Second秒秒-公有成员;公有成员;例如:例如:Clock c; Clock c; / /在在栈栈中分配中分配ClockClock型存储空间型存储空间ClockClock* * pc1=new Clock; pc1=new Clock;/ /在在堆堆中分配中分配ClockClock型存储空间型存储空间ClockClock* * pc2=&c; pc2=&c;pc1pc1-SetTime(12,5,0);SetTime(12,5,0);1. 1. 对象指针对象指针49void main()void main() ClockClock* * pmyclock=new

41、 pmyclock=new Clock; Clock;pmyclockpmyclock-SetTime(12, 5, 0);SetTime(12, 5, 0);pmyclockpmyclock-ShowTime();ShowTime();delete delete pmyclockpmyclock; ; 1. 1.对象指针对象指针50问:一个类中所有对象调用的成员函数都执行同一段问:一个类中所有对象调用的成员函数都执行同一段代码。那么,成员函数又是代码。那么,成员函数又是怎么识别当前是那个对怎么识别当前是那个对象在访问呢象在访问呢? 答:答:thisthis指针指出指针指出了成员函数当前所操作

42、的数据所属了成员函数当前所操作的数据所属的的对象。对象。不同的对象调用成员函数时,不同的对象调用成员函数时,thisthis指针将指向指针将指向不同的对象,也就可以不同的对象,也就可以访问不同对象的数据成员访问不同对象的数据成员。 指针指针51v如果如果通过通过某个某个对象调用对象调用其其公有成员公有成员,则此时该对,则此时该对象被称为象被称为当前对象当前对象,系统用,系统用thisthis指针指针指向当前对象。指向当前对象。v成员函数被调用时,它除了得到实际参数外,还成员函数被调用时,它除了得到实际参数外,还得到了指向当前对象的得到了指向当前对象的thisthis指针指针。例如:例如: Cl

43、ock c1,c2; Clock c1,c2; c1.SetTime(12,5,0);/ c1.SetTime(12,5,0);/此时此时thisthis指向指向c1c1 c1.ShowTime(); c1.ShowTime(); c2.SetTime(11,4,2); / c2.SetTime(11,4,2); /此时此时thisthis指向指向c2c2 c2.ShowTime(); c2.ShowTime();指针指针52v在成员函数内部,所有对类成员的访问都隐含地加在成员函数内部,所有对类成员的访问都隐含地加上前缀上前缀this-this-。所以函数所以函数SetTime()SetTim

44、e()的实现相当于:的实现相当于:void Clock:SetTime(Clock * this,int newH,int newM,int newS) this-Hour=newH; / /但是不能在但是不能在HourHour前加对象名前加对象名this-Minute=newM;this-Second=newS; 指针指针53v对象数组的元素是对象,不仅具有数据成员,而且对象数组的元素是对象,不仅具有数据成员,而且还有函数成员,可以通过数组元素调用成员函数。还有函数成员,可以通过数组元素调用成员函数。 3.3.对象数组对象数组54/ /例例7.3 7.3 使用对象数组使用对象数组# #inc

45、lude include using namespace std;using namespace std;class studentclass student private:private:int id;int id;char name20;char name20;int age;int age;float score;float score;public:public:void set(int, charvoid set(int, char* *, int, float);, int, float); void printstu(); void printstu(); ;3.3.对象数组对

46、象数组 例例 7.3: 7.3: 定义学生类定义学生类studentstudent,数据成员包括:学号、数据成员包括:学号、姓名、年龄、成绩;姓名、年龄、成绩;函数成员有设置值和函数成员有设置值和输出显示。输出显示。在主函数中定义学生在主函数中定义学生数组,表示多个学生,给数组,表示多个学生,给每个学生设置值,然后输每个学生设置值,然后输出显示。出显示。 55void student:set(int i, charvoid student:set(int i, char* * c, int a, float s) c, int a, float s) id = i; id = i;strcpy

47、(name, c);strcpy(name, c);age = a;age = a;score = s;score = s; void student:void student: printstu()printstu(); cout cout学号:学号:id id 姓名:姓名:name;name; cout cout 年龄:年龄:age age 成绩:成绩:scoreendl;scoreendl; 3.3.对象数组对象数组56void main()void main() student student stu5;stu5;/ /对象数组对象数组stu0.stu0.setset(1,wang,1

48、8, 86); /(1,wang,18, 86); /设置数组中每个对象设置数组中每个对象stu1.set(2,Li,18, 72);stu1.set(2,Li,18, 72);stu2.set(3,zhao,18, 80);stu2.set(3,zhao,18, 80);stu3.set(4,guo,18, 85);stu3.set(4,guo,18, 85);stu4.set(5,meng,18, 75);stu4.set(5,meng,18, 75);for(int i=0; i5; i+)for(int i=0; i5; i+)stui.printstustui.printstu();

49、 /(); /显示每个对象显示每个对象 3.3.对象数组对象数组57v可以将可以将对象对象作为作为参数参数传递给一个函数传递给一个函数 直接用直接用对象作为参数对象作为参数,调用函数时,进行,调用函数时,进行值传递值传递,实参,实参的值要复制给形参的值要复制给形参; ; 如果类的如果类的数据成员较多时,需要一一复制数据成员较多时,需要一一复制,这种参数传,这种参数传递方式递方式效率不高效率不高,可以,可以使用使用对象指针或对象引用方式对象指针或对象引用方式来来传递函数参数传递函数参数。 v可以可以从函数返回一个对象从函数返回一个对象。 4.4.对象用做函数的参数和返回值对象用做函数的参数和返回

50、值58/ /Tdate.hTdate.h:TdateTdate类声明类声明# #include include using namespace std;using namespace std;class Tdateclass Tdate public:public: void Set(int,int,int); / void Set(int,int,int); /成员函数的声明成员函数的声明 int IsLeapYear();int IsLeapYear(); void Print(); void Print();private:private: int month; int month; i

51、nt day; int day; int year; int year; ;例例7.4 7.4 使用使用对象对象作为函数的参数作为函数的参数59/ /Tdate.cppTdate.cpp:TdateTdate类成员函数实现类成员函数实现# #include include “”void Tdate:Set(int m,int d,int y)void Tdate:Set(int m,int d,int y) month=m; day=d; year=y; month=m; day=d; year=y; int Tdate:IsLeapYear()int Tdate:IsLeapYear()re

52、turn return (year%4=0&year%100!=0)|(year%400=0);(year%4=0&year%100!=0)|(year%400=0); void Tdate:Print()void Tdate:Print() cout month / day / year endl; cout month / day / year endl; 例例7.4 7.4 使用使用对象对象作为函数的参数作为函数的参数60/ /例的应用程序:例的应用程序: #include #include using namespace std;using namespace std;

53、#include Tdate.h#include Tdate.hvoid someFunc(void someFunc(Tdate somedayTdate someday) ) somedaysomeday. .Print(); Print(); if(someday if(someday. .IsLeapYear() IsLeapYear() cout leap yearn; cout leap yearn; else cout not leap yearn; else cout not leap yearn; void main()void main() Tdate s;Tdate s;

54、 s.Set(2,15,2003); s.Set(2,15,2003); someFunc(s);someFunc(s); / /对象作为函数参数对象作为函数参数 例例7.4 7.4 使用使用对象对象作为函数的参数作为函数的参数61例:类的定义和例相同。主程序把类例:类的定义和例相同。主程序把类对象的对象的指针指针作为实参数来调用函数。作为实参数来调用函数。 例例7.5 7.5 使用使用对象指针对象指针作为函数的参数作为函数的参数62/ /例:使用对象指针传递函数参数例:使用对象指针传递函数参数#include #include using namespace std;using namesp

55、ace std;#include Tdate.h #include Tdate.h void someFunc(Tdatevoid someFunc(Tdate* * pS pS) /) /对象的指针作形参对象的指针作形参 pS-pS-Print(); / Print(); / ,pSpS是是s s对象的指针对象的指针 if(if(pS-pS-IsLeapYear()IsLeapYear() cout leap yearn; cout leap yearn; else else cout not leap yearn; cout not leap yearn; void main() void

56、 main() Tdate s; Tdate s; s.Set(2,15,2003); s.Set(2,15,2003); someFunc someFunc(&s); /(&s); /对象的地址作实参对象的地址作实参 返回地址参数2003操作系统运行状态15main()栈区.s:2yearmonthday返回地址main()运行状态someFunc()ps例例7.5 7.5 使用使用对象指针对象指针作为函数的参数作为函数的参数63 例:类的定义和例相同。主程序把例:类的定义和例相同。主程序把类对象的引用类对象的引用作为作为实参数来调用函数实参数来调用函数。例例7.6 7.6

57、使用使用对象引用对象引用作为函数的参数作为函数的参数64/ /例:使用例:使用对象引用对象引用传递函数参数传递函数参数#include #include using namespace std;using namespace std;#include #include “”void someFunc(Tdate void someFunc(Tdate & someday& someday) ) someday.Print(); someday.Print(); if(someday.IsLeapYear()if(someday.IsLeapYear() cout leap ye

58、arn; cout leap yearn; else cout not leap yearn; else cout not leap yearn; void main() Tdate s; s.Set(2,15,2003); someFunc(s); 例例7.6 7.6 使用使用对象引用对象引用作为函数的参数作为函数的参数65/例例7-7:使用对象的引用作为函数的返回值:使用对象的引用作为函数的返回值#include using namespace std;class Rectangle private: float width,height; public: void SetRectangl

59、e(float newW, float newH) width = newW; height=newH; float Area() return width*height; ;例例7.7 7.7 使用使用对象引用对象引用作为函数的作为函数的返回值返回值66/例例7-7:使用对象的引用作为函数的返回值:使用对象的引用作为函数的返回值Rectangle &compare(Rectangle & r1,Rectangle & r2) if (r1.Area() r2.Area() return r1; else return r2;void main() Rectangle

60、rect1,rect2,rect3; rect1.SetRectangle(12,21); rect2.SetRectangle(21,14); rect3.SetRectangle(21,12); Rectangle & maxR = compare(rect3,compare(rect1,rect2); cout The larger rectangle has area: maxR.Area() endl;例例7.7 7.7 使用使用对象引用对象引用作为函数的作为函数的返回返回值值67例例7.7 7.7 使用使用对象引用对象引用作为函数的参数作为函数的参数7.1 7.1 类和对象的定义类和对象的定义7.2 7.2 对象的使用对象的使用7.3 7.3 构造函数构造函数7.4 7.4 析构函数析构函数 7.5 7.5 类的静态成员类的静态成员 7.6 7.6

温馨提示

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

评论

0/150

提交评论