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