《第三章类与对象精选文档.ppt》由会员分享,可在线阅读,更多相关《第三章类与对象精选文档.ppt(171页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章类与对象本讲稿第一页,共一百七十一页学习目标学习目标(1 1)理解类的概念,掌握类的定义方法)理解类的概念,掌握类的定义方法(2 2)理解对象与类的关系,掌握对象的创建和)理解对象与类的关系,掌握对象的创建和使用方法使用方法(3 3)掌握构造函数、析构函数的概念和使用方)掌握构造函数、析构函数的概念和使用方法法(4 4)掌握拷贝构造函数的使用方法)掌握拷贝构造函数的使用方法(5 5)掌握对象数组和对象指针的特点和使用方)掌握对象数组和对象指针的特点和使用方法法(6 6)掌握函数调用中参数的传递方式)掌握函数调用中参数的传递方式(7 7)理解类的组合的特点)理解类的组合的特点本讲稿第二页,
2、共一百七十一页3.1 3.1 类和对象的概念类和对象的概念类是对一组具有共同属性特征和行为特征的实体(对象)类是对一组具有共同属性特征和行为特征的实体(对象)的抽象,它将相关数据及对这些数据的操作组合在一起。的抽象,它将相关数据及对这些数据的操作组合在一起。对象是封装了数据和可以施加在这些数据上的操作的对象是封装了数据和可以施加在这些数据上的操作的封装体,它是类的实际变量,即类的实例。封装体,它是类的实际变量,即类的实例。本讲稿第三页,共一百七十一页3.1.1类的基本概念 类(类(classclass)是面向对象系统中最基本的组成元)是面向对象系统中最基本的组成元素,是一种自定义数据类型。在素
3、,是一种自定义数据类型。在C+C+中,类是一些具中,类是一些具有相同属性和行为的对象的抽象。有相同属性和行为的对象的抽象。本讲稿第四页,共一百七十一页3.1.2对象的基本概念 对象是某个特定类所描述的实例。现实世界中对象是某个特定类所描述的实例。现实世界中的任何一种事物都可以看成一个对象的任何一种事物都可以看成一个对象(Object)(Object),即,即万物皆对象。万物皆对象。本讲稿第五页,共一百七十一页3.2 3.2 类的定义类的定义 类的定义包括两部分:类头和类体。类的定义包括两部分:类头和类体。类头由关键字类头由关键字“class”“class”及其后面的类名构成;及其后面的类名构成
4、;类体用于对类的数据成员和成员函数进行声明,并指定相类体用于对类的数据成员和成员函数进行声明,并指定相应成员的访问级别。应成员的访问级别。本讲稿第六页,共一百七十一页3.2.1类的定义格式class类名类名private:数据成员或成员函数数据成员或成员函数protected:数据成员或成员函数数据成员或成员函数public:数据成员或成员函数数据成员或成员函数;本讲稿第七页,共一百七十一页说明:说明:(1 1)classclass是声明类的关键字,是声明类的关键字,classclass后跟类名。类名的后跟类名。类名的首字符通常采用大写字母。首字符通常采用大写字母。(2 2)类的成员包括数据成
5、员和成员函数两类。)类的成员包括数据成员和成员函数两类。(3 3)类声明中的)类声明中的privateprivate、protectedprotected和和publicpublic关键字称关键字称为访问权限符,它规定了类中成员的访问属性。为访问权限符,它规定了类中成员的访问属性。C+C+中规定,中规定,一个访问权限符后面说明的所有成员都具有由这一访问权限一个访问权限符后面说明的所有成员都具有由这一访问权限符规定的访问属性,直到另一个不同的访问权限符出现。对符规定的访问属性,直到另一个不同的访问权限符出现。对于一个具体的类,类声明中的于一个具体的类,类声明中的privateprivate、pr
6、otectedprotected和和publicpublic三个部分不一定都要有,但至少应该有其中一个部分。三个部分不一定都要有,但至少应该有其中一个部分。(4 4)在)在C+C+中,由于类是一种数据类型,系统不会中,由于类是一种数据类型,系统不会为其分配存储空间,所以不能在类声明中给数据成员赋为其分配存储空间,所以不能在类声明中给数据成员赋初值。初值。(5 5)类声明完成后一定要以)类声明完成后一定要以“;”“;”结束。结束。本讲稿第八页,共一百七十一页 【例【例3-13-1】声明一个学生类】声明一个学生类 分析:每个学生都有学号、姓名和性别;对于分析:每个学生都有学号、姓名和性别;对于学生
7、的基本操作有输入、输出信息等。学生的基本操作有输入、输出信息等。本讲稿第九页,共一百七十一页classStudent/声明类private:/访问权限:私有成员charstudentNo10;/属性,数据成员,表示学号charstudentName20;/属性,数据成员,表示姓名charstudentSex6;/属性,数据成员,表示性别public:/访问权限:公有成员 Student();/行为,成员函数的原型声明,表示构造函数voidinput();voidprint();/类声明结束本讲稿第十页,共一百七十一页3.2.2类的成员 对于对于C+C+,类中共有两类成员:,类中共有两类成员:1
8、 1)代表对象属性的数据成员)代表对象属性的数据成员 2 2)代表实现对象行为的成员函数)代表实现对象行为的成员函数本讲稿第十一页,共一百七十一页3.2.3类成员访问控制权限 public public(公有类型)、(公有类型)、privateprivate(私有类型)和(私有类型)和protectedprotected(保护类型)。(保护类型)。1 1、publicpublic(公有类型)(公有类型)public public声明成员为公有成员。具有这个访问控制级别声明成员为公有成员。具有这个访问控制级别的成员是完全公开的,即该成员不但可以被它所在类的成的成员是完全公开的,即该成员不但可以被
9、它所在类的成员函数及该类的友元函数访问,而且也可以被和该类对象员函数及该类的友元函数访问,而且也可以被和该类对象处在同一作用域内的任何函数访问。处在同一作用域内的任何函数访问。本讲稿第十二页,共一百七十一页 【例【例3-23-2】具有】具有publicpublic访问权限的成员的应用访问权限的成员的应用#include stdafx.h#include stdafx.h#includeiostream#includeiostreamusing namespace std;using namespace std;class Limitclass Limitpublic:public:/声明类的公
10、有成员声明类的公有成员 char name30;char name30;void accept()void accept()coutn Enter your name,please:;coutname;cinname;/类的成员函数访问类的共有数据成员类的成员函数访问类的共有数据成员 coutn Your name is:nameendl;coutn Your name is:nameendl;void main()void main()Limit c;Limit c;/定义类的对象定义类的对象 c.accept();c.accept();/通过对象访问类的公有成员函数通过对象访问类的公有成员
11、函数 coutc.nameendl;coutc.nameendl;/通过对象访问类的公有数据成员通过对象访问类的公有数据成员本讲稿第十三页,共一百七十一页说明:说明:(1 1)在一个项目中的每一个)在一个项目中的每一个.cpp.cpp文件都包含有大量的相同文件都包含有大量的相同的的MFCMFC标准头文件,这些头文件都非常大,即使有一个快速的处标准头文件,这些头文件都非常大,即使有一个快速的处理程序,完成其编译也要花费相当长的时间,因此,对这些头理程序,完成其编译也要花费相当长的时间,因此,对这些头文件进行预先编译,以后该工程编译时,不再编译这部分头文文件进行预先编译,以后该工程编译时,不再编译
12、这部分头文件,仅仅使用预编译的结果,就可以节省大量的编译时间。件,仅仅使用预编译的结果,就可以节省大量的编译时间。“stdafx.h”“stdafx.h”文件中就包含了这些必要的标准头文件。文件中就包含了这些必要的标准头文件。#include stdafx.h#include stdafx.h的作用就是令编译器编译出一个的作用就是令编译器编译出一个stdafx.objstdafx.obj预编译头文件。因此,一般预编译头文件。因此,一般.cpp.cpp文件的第一条语句文件的第一条语句都是都是#include stdafx.h#include stdafx.h。本讲稿第十四页,共一百七十一页 (2
13、 2)#include“iostream”#include“iostream”表示将文件表示将文件iostreamiostream中的代码嵌入中的代码嵌入到程序中该指令所在的地方。文件到程序中该指令所在的地方。文件iostreamiostream中声明了相关的输入和输中声明了相关的输入和输出操作信息。出操作信息。(3 3)和)和C C语言一样,在语言一样,在C+C+中,中,mainmain是主函数名,每一个项目是主函数名,每一个项目中有且仅有一个主函数,它表示程序执行的开始点。中有且仅有一个主函数,它表示程序执行的开始点。本讲稿第十五页,共一百七十一页 (4 4)coutcout和和cinci
14、n是是C+C+预定义的流类对象,它们被定义在预定义的流类对象,它们被定义在iostreamiostream文件的文件的stdstd命名空间中,用来实现数据的输出命名空间中,用来实现数据的输出/输入操作。输输入操作。输出操作是由出操作是由coutcout和和“”“”“”结合结合表示接收从标准输入设备(键盘)输入的数据。表示接收从标准输入设备(键盘)输入的数据。本讲稿第十六页,共一百七十一页 2 2、privateprivate(私有类型)(私有类型)private private声明成员为私有成员。具有这个访问控制级声明成员为私有成员。具有这个访问控制级别的成员对类外是完全保密的,即只能被它所在
15、类中的成别的成员对类外是完全保密的,即只能被它所在类中的成员函数和该类的友元函数访问。员函数和该类的友元函数访问。本讲稿第十七页,共一百七十一页【例【例3-33-3】具有】具有privateprivate访问权限的成员的应用访问权限的成员的应用#include stdafx.h#include stdafx.h#includeiostream#includeiostreamusing namespace std;using namespace std;class Limitclass Limitprivate:private:/声明类的私有成员声明类的私有成员 float imprest;fl
16、oat imprest;void warning()void warning()coutWarning!;coutWarning!;本讲稿第十八页,共一百七十一页public:public:/声明类的公有成员声明类的公有成员 void accept()void accept()coutn Enter your imprest,please:t;coutimprest;cinimprest;coutn Your imprest is:timprest;coutn Your imprest is:timprest;/类的私有数据成员可以被本类的成员函数访问类的私有数据成员可以被本类的成员函数访问
17、void display()void display()coutn Now,your imprest is:timprest;coutn Now,your imprest is:timprest;warning warning();();/类的私有成员函数可以被本类的成员函数访问类的私有成员函数可以被本类的成员函数访问;本讲稿第十九页,共一百七十一页void main()void main()Limit c;Limit c;c.accept();c.accept();c.display();c.display();c.imprest=3.3f;c.imprest=3.3f;/错误,不能通过对象
18、访问类的私有数据成员错误,不能通过对象访问类的私有数据成员 c.warning();c.warning();/错误,不能通过对象访问类的私有成员函数错误,不能通过对象访问类的私有成员函数 本讲稿第二十页,共一百七十一页本讲稿第二十一页,共一百七十一页 3 3、protectedprotected(保护类型)(保护类型)protected protected声明成员为保护成员。具有这个访问声明成员为保护成员。具有这个访问控制级别的成员,外界是无法直接访问的。它只能被控制级别的成员,外界是无法直接访问的。它只能被它所在类及从该类派生的子类的成员函数及友元函数它所在类及从该类派生的子类的成员函数及友
19、元函数访问。访问。本讲稿第二十二页,共一百七十一页例【例【3-43-4】具有】具有protectedprotected访问权限的成员的应用访问权限的成员的应用#include stdafx.h#include stdafx.hclass Limitclass Limit protected:protected:/声明类的保护成员声明类的保护成员 float imprest;float imprest;void warning()void warning()coutWarning!;coutimprest;/类的保护数据成员可以被本类的成员函数访问coutnYourimprestis:timpr
20、est;本讲稿第二十四页,共一百七十一页class Extends:public Limit class Extends:public Limit /声明类声明类LimitLimit的派生类的派生类ExtendsExtends public:public:void ext_display()void ext_display()coutn the display of extends class is:;coutn the display of extends class is:;warning();warning();/访问从基类继承的保护成员函数访问从基类继承的保护成员函数 ;本讲稿第二十五
21、页,共一百七十一页void main()Limit c;Limit c;c.accept();c.accept();c.imprest;c.imprest;/错误类的对象不能访问类的保护数据成员错误类的对象不能访问类的保护数据成员 c.warning;c.warning;/错误类的对象不能访问类的保护成员函数错误类的对象不能访问类的保护成员函数 本讲稿第二十六页,共一百七十一页本讲稿第二十七页,共一百七十一页 publicpublic、protectedprotected和和privateprivate三种类成员的可访问性三种类成员的可访问性访问限定符自身的类成员是否可访问子类的类成员是否可访
22、问自身的类对象是否可访问publicprotectedprivate本讲稿第二十八页,共一百七十一页3.2.4成员函数的实现方式 类的成员函数也是函数的一种,它与一般函数的区别类的成员函数也是函数的一种,它与一般函数的区别是:它属于一个特定的类,并且它必须被指定为是:它属于一个特定的类,并且它必须被指定为privateprivate、publicpublic或或protectedprotected三种访问权限中的一种。三种访问权限中的一种。在使用类的成员函数时,要注意它的访问权限在使用类的成员函数时,要注意它的访问权限(它能否被访问它能否被访问),以及它的作用域,以及它的作用域(类函数能在什么
23、类函数能在什么范围内被访问范围内被访问)。本讲稿第二十九页,共一百七十一页 类的成员函数的定义方式有两种类的成员函数的定义方式有两种:第一种方式是在类中进行函数原型说明,而函第一种方式是在类中进行函数原型说明,而函数体则在类外进行定义。数体则在类外进行定义。采用这种方式定义类函数时,必须用作用域符采用这种方式定义类函数时,必须用作用域符“:”“:”表明该函数所属的类。表明该函数所属的类。本讲稿第三十页,共一百七十一页返回类型返回类型类名类名:函数名(参数列表)函数名(参数列表)/函数体函数体本讲稿第三十一页,共一百七十一页【例【例3-53-5】定义时钟类。】定义时钟类。#include std
24、afx.h#include stdafx.h#include iostream#include iostreamusing namespace std;using namespace std;class Clockclass Clock private:private:int hour,minute,second;int hour,minute,second;public:public:void setTime(int newH,int newM,int newS);void setTime(int newH,int newM,int newS);/函数原型说明函数原型说明 void show
25、Time();void showTime();/函数原型说明函数原型说明 ;本讲稿第三十二页,共一百七十一页 void Clock:setTime(int newH,int newM,int newS)void Clock:setTime(int newH,int newM,int newS)/定义成员函数定义成员函数 hour=newH;hour=newH;minute=newM;minute=newM;second=newS second=newS 本讲稿第三十三页,共一百七十一页说明:说明:(1 1)在定义成员函数时,对函数所带的参数,既要)在定义成员函数时,对函数所带的参数,既要说明其
26、类型,也要指出参数名;说明其类型,也要指出参数名;(2 2)在定义成员函数时,其返回值必须与函数原)在定义成员函数时,其返回值必须与函数原型声明中的返回类型相同。型声明中的返回类型相同。第二种方式是在类内直接进行定义。这种方式一第二种方式是在类内直接进行定义。这种方式一般用在代码比较少的成员函数。般用在代码比较少的成员函数。本讲稿第三十四页,共一百七十一页3.2.5成员函数设置为内联函数一般的函数使用过程中,需要进行函数调用,由于在调一般的函数使用过程中,需要进行函数调用,由于在调用函数时,需要保存现场和返回地址、进行参数传递,再转用函数时,需要保存现场和返回地址、进行参数传递,再转到子函数的
27、代码起始地址去执行。子函数执行完后,又要取到子函数的代码起始地址去执行。子函数执行完后,又要取出以前保存的返回地址和现场状态,再继续执行。出以前保存的返回地址和现场状态,再继续执行。内联函数与一般函数的区别在于它不是在调用时发生控制内联函数与一般函数的区别在于它不是在调用时发生控制转移,而是在编译时将函数体嵌入到每一个调用处。这样就节转移,而是在编译时将函数体嵌入到每一个调用处。这样就节省了参数传递、控制转移等开销。省了参数传递、控制转移等开销。本讲稿第三十五页,共一百七十一页内联函数的定义格式为:内联函数的定义格式为:inline返回值类型返回值类型函数名(形参列表)函数名(形参列表)/函数
28、体函数体说明:说明:(1 1)内联函数体内不能含有循环语句和)内联函数体内不能含有循环语句和switchswitch语句;语句;(2 2)内联函数的定义必须出现在第一次被调用之前;)内联函数的定义必须出现在第一次被调用之前;(3 3)对内联函数不能进行异常接口声明。)对内联函数不能进行异常接口声明。本讲稿第三十六页,共一百七十一页内联函数实际上是一种以空间换时间的方案,其缺内联函数实际上是一种以空间换时间的方案,其缺点是加大了空间方面的开销。它通常用在结构简单、语点是加大了空间方面的开销。它通常用在结构简单、语句少、使用多的情况下。句少、使用多的情况下。C+C+默认在类内给出函数体定义的成员函
29、数为内联函默认在类内给出函数体定义的成员函数为内联函数。数。本讲稿第三十七页,共一百七十一页【例【例3-63-6】内联函数应用举例,计算正方形的面积及周长。】内联函数应用举例,计算正方形的面积及周长。class Squareclass Square private:private:double length;double length;public:public:Square(double x);Square(double x);void area()void area()/函数体在类内定义,默认为内联函数函数体在类内定义,默认为内联函数 cout cout正方形的面积为正方形的面积为:len
30、gth*lengthendl;:length*lengthendl;inline void Perimeter();inline void Perimeter();/内联函数声明内联函数声明 ;Square:Square(double x)Square:Square(double x)length=x;length=x;本讲稿第三十八页,共一百七十一页 inline void Square:Perimeter()inline void Square:Perimeter()/内联函数定义内联函数定义 cout cout正方形的周长为正方形的周长为:4*lengthendl;:4*lengthen
31、dl;void main()void main()Square ss(2.0);Square ss(2.0);ss.area();ss.area();ss.Perimeter();ss.Perimeter();本讲稿第三十九页,共一百七十一页说明:说明:(1 1)内联函数代码不宜过长,一般是小于)内联函数代码不宜过长,一般是小于1010行行代码的小程序,并且不能含有复杂的分支(代码的小程序,并且不能含有复杂的分支(switchswitch)和循环语句。和循环语句。(2 2)在类内定义的成员函数默认为内联函数。)在类内定义的成员函数默认为内联函数。(3 3)在类外给出函数体定义的成员函数,若要定
32、义)在类外给出函数体定义的成员函数,若要定义为内联函数,必须加上关键字为内联函数,必须加上关键字inlineinline。(4 4)递归调用的函数不能定义为内联函数。)递归调用的函数不能定义为内联函数。本讲稿第四十页,共一百七十一页3.2.6成员函数重载函数重载是指两个以上的函数,具有相同的函数名,函数重载是指两个以上的函数,具有相同的函数名,可以对应着多个函数的实现。每种实现对应着一个函数体,可以对应着多个函数的实现。每种实现对应着一个函数体,但是形参的个数或者类型不同,编译器根据实参和形参的但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。类型
33、及个数的最佳匹配,自动确定调用哪一个函数。本讲稿第四十一页,共一百七十一页 【例【例3-73-7】函数重载举例。】函数重载举例。创建一个类,在类中定义三个名为创建一个类,在类中定义三个名为subtractsubtract的重载的重载成员函数,分别实现两个整数相减、两个实数相减和两成员函数,分别实现两个整数相减、两个实数相减和两个复数相减的功能个复数相减的功能structcomplexdoublereal;doubleimag;本讲稿第四十二页,共一百七十一页class Overloaded public:int subtract(int x,int y);double subtract(dou
34、ble x,double y);/函数重载 complex subtract(complex x,complex y);/函数重载;本讲稿第四十三页,共一百七十一页intOverloaded:subtract(intx,inty)returnx-y;doubleOverloaded:subtract(doublex,doubley)returnx-y;complexOverloaded:subtract(complexx,complexy)complexc;c.real=x.real-y.real;c.imag=x.imag-y.imag;returnc;本讲稿第四十四页,共一百七十一页int
35、main()intm,n;doublex,y;complexa,b,c;Overloadedol;m=32;n=23;x=31.1;y=22.2;a.real=12.3;a.imag=10.2;b.real=23.5;b.imag=1.2;coutm-n=ol.subtract(m,n)endl;coutx-y=ol.subtract(x,y)endl;c=ol.subtract(a,b);couta.real+a.imag-b.real+b.imag=c.real+c.imagendl;return0;本讲稿第四十五页,共一百七十一页3.3 3.3 对象的创建与使用对象的创建与使用 在在C+
36、C+中,声明了类,只是定义了一种新的数据类型,中,声明了类,只是定义了一种新的数据类型,只有当定义了类的对象后,才是生成了这种数据类型的特只有当定义了类的对象后,才是生成了这种数据类型的特定实体(实例)。对象是类的实际变量,创建一个对象称定实体(实例)。对象是类的实际变量,创建一个对象称为实例化一个对象或创建一个对象实例。为实例化一个对象或创建一个对象实例。本讲稿第四十六页,共一百七十一页3.3.1对象的定义1 1、先声明类类型,然后在使用时再定义对象、先声明类类型,然后在使用时再定义对象定义格式与一般变量定义格式相同:定义格式与一般变量定义格式相同:类名类名对象名列表;对象名列表;本讲稿第四
37、十七页,共一百七十一页2 2、在声明类的同时,直接定义对象、在声明类的同时,直接定义对象class Student stud1,stud2;3 3、不出现类名,直接定义对象、不出现类名,直接定义对象class stud1,stud2;本讲稿第四十八页,共一百七十一页说明:说明:(1 1)必须先定义类,然后再定义类的对象。多个对象)必须先定义类,然后再定义类的对象。多个对象之间用逗号分隔。之间用逗号分隔。(2 2)声明了一个类就是声明了一种新的数据类型,它)声明了一个类就是声明了一种新的数据类型,它本身不能接收和存储具体的值,只有定义了类的对象后,本身不能接收和存储具体的值,只有定义了类的对象后
38、,系统才为其对象分配存储空间。系统才为其对象分配存储空间。(3 3)在声明类的同时定义的类对象是一种全局对)在声明类的同时定义的类对象是一种全局对象,它的生存期一直到整个程序运行结束。象,它的生存期一直到整个程序运行结束。本讲稿第四十九页,共一百七十一页3.3.2 对象成员的访问1.1.通过对象名和成员运算符访问对象的成员通过对象名和成员运算符访问对象的成员使用这种方式访问对象的数据成员的一般形式为:使用这种方式访问对象的数据成员的一般形式为:对象名对象名.数据成员数据成员使用这种方式访问对象的成员函数的一般形式为:使用这种方式访问对象的成员函数的一般形式为:对象名对象名.成员函数名成员函数名
39、(实参列表实参列表)注意:对象只能访问其的公有(注意:对象只能访问其的公有(publicpublic)成员)成员本讲稿第五十页,共一百七十一页 【例【例3-83-8】建立图书档案类,通过键盘输入每种图书的】建立图书档案类,通过键盘输入每种图书的相关信息,并按价格从低到高的顺序排序输出。相关信息,并按价格从低到高的顺序排序输出。class Book class Book /Book.h/Book.h public:public:char title20,auther10,publish30;char title20,auther10,publish30;/书名、作者、出版社书名、作者、出版社 f
40、loat price;float price;/价格价格 void input();void input();void output();void output();本讲稿第五十一页,共一百七十一页#includestdafx.h/Book.cpp#includeusingnamespacestd;#invoidBook:input()cintitleautherpublishprice;voidBook:output()couttitleautherpublishpriceendl;cludeBook.h本讲稿第五十二页,共一百七十一页int main()int main()int i,j;
41、int i,j;Book bk10,temp;Book bk10,temp;cout cout 请输入书名、作者、出版社和价格请输入书名、作者、出版社和价格endl;endl;for(i=0;i10;i+)for(i=0;i10;i+)bki.input();bki.input();for(i=0;i10;i+)for(i=0;i10;i+)for(j=i+1;j10;j+)for(j=i+1;jbkj.price)if(bki.price bkj.price)temp=bki;bki=bkj;bkj=temp;temp=bki;bki=bkj;bkj=temp;cout cout 输出结果输
42、出结果endl;endl;cout cout 书名书名 作者作者 出版社出版社 价格价格endl;endl;for(i=0;i10;i+)for(i=0;i数据成员数据成员使用这种方式访问对象的成员函数的一般形式为使用这种方式访问对象的成员函数的一般形式为:指向对象的指针指向对象的指针-成员函数名成员函数名(实参列表实参列表)本讲稿第五十四页,共一百七十一页 【例【例3-93-9】改写【例】改写【例3-83-8】中的主函数,通过指向对象的指针访问对】中的主函数,通过指向对象的指针访问对象的数据成员和成员函数。象的数据成员和成员函数。int main()int main()int i,j;int
43、 i,j;Book bk10,*p1,*p2,temp;Book bk10,*p1,*p2,temp;cout cout 请输入书名、作者、出版社和价格请输入书名、作者、出版社和价格endl;endl;for(i=0;i10;i+)for(i=0;iinput();p1-input();/通过指向对象的指针访问对象的成员函数通过指向对象的指针访问对象的成员函数 本讲稿第五十五页,共一百七十一页 for(i=0;i10;i+)p1=&bki;for(j=i+1;jpricep2-price)/通过指向对象的指针访问对象的数据成员temp=*p1;*p1=*p2;*p2=temp;bki=*p1;
44、bkj=*p2;本讲稿第五十六页,共一百七十一页 cout输出结果:endl;cout书名作者出版社价格endl;for(i=0;ioutput();return0;本讲稿第五十七页,共一百七十一页3.3.通过对象的引用访问对象中的成员通过对象的引用访问对象中的成员 对象的引用变量与该对象共占同一段存储单元,对象的引用变量与该对象共占同一段存储单元,实际上它们是同一个对象,只是用不同的名字表示而实际上它们是同一个对象,只是用不同的名字表示而已。因此完全可以通过引用变量来访问对象中的成员。已。因此完全可以通过引用变量来访问对象中的成员。定义一个对象的引用变量的方法为:定义一个对象的引用变量的方法
45、为:&引用变量名引用变量名=对象名对象名;本讲稿第五十八页,共一百七十一页【例【例3-103-10】通过对象的引用变量来访问对象的数据成员和成员函数。】通过对象的引用变量来访问对象的数据成员和成员函数。class Timeclass Time public:public:int hour;int hour;int minute;int minute;int second;int second;void showTime();void showTime();int main()int main()Time t1;Time t1;t1.hour=2;t1.hour=2;t1.minute=12;t
46、1.minute=12;t1.second=34;t1.second=34;Time&t2=t1;Time&t2=t1;/定义定义t1t1对象的引用变量对象的引用变量t2t2 coutt2.hourendl;coutt2.hourendl;/通过引用变量访问对象的数据成员通过引用变量访问对象的数据成员 coutt2.minuteendl;coutt2.minuteendl;coutt2.secondendl;coutt2.secondendl;t2.showTime();t2.showTime();/通过引用变量访问对象的成员函数通过引用变量访问对象的成员函数 本讲稿第五十九页,共一百七十一页
47、本讲稿第六十页,共一百七十一页3.4 3.4 构造函数构造函数 构造函数(构造函数(ConstructorConstructor)是一种特殊的成员函数,它)是一种特殊的成员函数,它是用来完成在声明对象的同时,对对象中的数据成员进行是用来完成在声明对象的同时,对对象中的数据成员进行初始化。初始化。本讲稿第六十一页,共一百七十一页3.4.1构造函数的定义和功能 构造函数的定义如下:构造函数的定义如下:类名类名(形参列表);形参列表);构造函数可以在类内也可在类外定义。在类外定义构造函数的形构造函数可以在类内也可在类外定义。在类外定义构造函数的形式如下:式如下:类名类名:类名(形参列表)类名(形参列
48、表)/函数体函数体;本讲稿第六十二页,共一百七十一页说明:说明:(1 1)构造函数的名称必须有类名相同。)构造函数的名称必须有类名相同。(2 2)构造函数没有返回值类型,也不能指定为)构造函数没有返回值类型,也不能指定为voidvoid。(3 3)构造函数可以有任意个任意类型的参数。)构造函数可以有任意个任意类型的参数。(4 4)如果没有显式的定义构造函数,系统会自动生成一个默认的)如果没有显式的定义构造函数,系统会自动生成一个默认的构造函数。这个构造函数不含有参数,也不对数据成员进行初始构造函数。这个构造函数不含有参数,也不对数据成员进行初始化,只负责为对象分配存储空间。化,只负责为对象分配
49、存储空间。(5 5)如果显式的为类定义了构造函数,系统将不再为类提供默)如果显式的为类定义了构造函数,系统将不再为类提供默认构造函数。认构造函数。(6 6)定义对象时,系统会自动调用构造函数。)定义对象时,系统会自动调用构造函数。(7 7)构造函数可以重载。)构造函数可以重载。(8 8)构造函数一般被定义为公有访问权限。)构造函数一般被定义为公有访问权限。本讲稿第六十三页,共一百七十一页【例【例3-113-11】举例说明构造函数的使用。】举例说明构造函数的使用。classDateprivate:intyear;intmonth;intday;public:Date(inty,intm,intd
50、);/声明构造函数voidOutput();本讲稿第六十四页,共一百七十一页Date:Date(inty,intm,intd)/定义构造函数year=y;month=m;day=d;voidDate:Output()coutyear/month/dayendl;voidmain()Datetoday(2012,10,10);today.Output();本讲稿第六十五页,共一百七十一页3.4.2默认构造函数如果类没有定义构造函数,系统会自动生成一个默认的如果类没有定义构造函数,系统会自动生成一个默认的构造函数。这个构造函数不含有参数,也不会对数据成员进构造函数。这个构造函数不含有参数,也不会对