第九章怎样使用类和对象1_第1页
第九章怎样使用类和对象1_第2页
第九章怎样使用类和对象1_第3页
第九章怎样使用类和对象1_第4页
第九章怎样使用类和对象1_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

9.1构造函数9.2析构函数9.3调用构造函数和析构函数的顺序9.4对象数组9.5对象指针9.6共用数据的保护9.7对象的动态建立和释放9.8对象的赋值和复制9.9静态成员9.10友元9.11类模板本章内容提要9.1构造函数9.1.1对象的初始化

在建立一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。类的数据成员是不能在声明类时初始化的。如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。classTime{public://声明为公用成员

hour;minute;sec;};Timet1={14,56,30};

//将t1初始化为14:56:30

29.1.2构造函数的作用

C++提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。构造函数的名字必须与类名同名它不具有任何类型,不返回任何值。39.1.2构造函数的作用例9.1设计钟,具有校正和报时功能,在构造函数初始化时间。#include<iostream>usingnamespacestd;classClock//声明钟类{public://声明钟类构造函数,函数名与类名相同

Clock(void);protected://钟的时

intnHour;

intnMinute;

intnSecond

;public://校正 voidCheck(void);//报时 voidGiveTheCorrectTime(void);};49.1.2构造函数的作用//校正voidClock::Check(void){ cout<<"校正钟,输入时、分和秒:"; cin>>nHour>>nMinute>>nSecond;}//报时voidClock::GiveTheCorrectTime(void){ //按时间格式输出钟的时、分和秒的值 cout<<"北京时间"<<nHour<<":"<<nMinute<<":"<<nSecond<<endl;}int_tmain(intargc,_TCHAR*argv[]){ Clockclock;//制造1个钟clock

clock.GiveTheCorrectTime();//钟clock报时 clock.Check();//校正钟clock clock.GiveTheCorrectTime();//钟clock报时 Clockwatche;//制造1个表watche watche.GiveTheCorrectTime();//表watche报时 watche.Check();//校正表watche watche.GiveTheCorrectTime();//表watche报时 return0;}

//项目:Atimesignalclock9.1.2构造函数的作用程序运行的情况为:北京时间:1:3:8//钟clock报时168↙

//通过键盘校正钟clock的时间北京时间:1:6:8//钟clock报时北京时间:1:3:8//钟watche报时668↙

//通过键盘校正表watche的时间北京时间:6:6:8//钟watche报时构造函数使用说明

在类对象进入其作用域时调用构造函数。构造函数没有返回值,因此也不需要在定义构造函数时声明类型构造函数不需用户调用,也不能被用户调用一般不提倡在构造函数中加入与初始化无关的内容如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。89.1.3带参数的构造函数构造函数首部的一般格式为构造函数名(类型1形参1,类型2形参2,…)定义对象的一般格式为类名对象名(实参1,实参2,…);99.1.3带参数的构造函数例9.2汽车和桌子的长、宽、高分别为:(1)1,3,8;(2)1,6,8。求它们的体积。编一个基于对象的程序,在类中用带参数的构造函数。#include<iostream>usingnamespacestd;9.1.3带参数的构造函数//声明长方体类classRectangular{protected:

//长方体的长 doublefLength;

//长方体的宽 doublefWidth;

//长方体的高 doublefHeight;9.1.3带参数的构造函数public:

//声明带参数的构造函数,

//建立指定长、宽和高的长方体 Rectangular(doublelength,doublewidth,doubleheight);

//声明求长方体的体积的函数 doubleVolume(void);};//项目:Therectangular9.1.3带参数的构造函数//定义带参数的构造函数,//建立指定长、宽和高的长方体Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}//项目:Therectangular9.1.3带参数的构造函数//定义求长方体的体积的函数doubleRectangular::Volume(void){

returnfLength*fWidth*fHeight;}//项目:Therectangular9.1.3带参数的构造函数int_tmain(intargc,_TCHAR*argv[]){

//制造汽车,并指定汽车的长、宽和高分别为1,3,8 RectangularCar(1,3,8);

//输出汽车的体积 cout<<"汽车的体积为"<<Car.Volume()<<"立方米。"<<endl;

//制作桌子,并指定桌子的长、宽和高分别为1,6,8 RectangularTable(1,6,8);

//输出桌子的体积 cout<<"桌子的体积为"<<Table.Volume()<<"立方米。"<<endl; return0;}9.1.3带参数的构造函数程序运行结果如下:汽车的体积为24立方米。桌子的体积为48立方米。9.1.3带参数的构造函数可以知道:(1)带参数的构造函数中的形参,其对应的实参在定义对象时给定。(2)用这种方法可以方便地实现对不同的对象进行不同的初始化。9.1.4用参数初始化表对数成员初始化在9.1.3节中介绍的是在构造函数的函数体内通过赋值语句对数据成员实现初始化。//定义带参数的构造函数,//建立指定长、宽和高的长方体Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}189.1.4参数初始化表对数成员初始化C++还提供另一种初始化数据成员的方法——参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例9.2中定义构造函数可以改用以下形式://定义带参数的构造函数,//建立指定长、宽和高的长方体Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}199.1.5构造函数的重载在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。20构造函数的重载举例#include<iostream>usingnamespacestd;//声明长方体类classRectangular{protected: doublefLength;//长方体的长

doublefWidth;

//长方体的宽 doublefHeight;

//长方体的高21构造函数的重载举例public:

//声明无参数的构造函数

Rectangular(void);

//声明带参数的构造函数,

//建立指定长、宽和高的长方体 Rectangular(doublelength,doublewidth,doubleheight);

//声明求长方体的体积的函数 doubleVolume(void);};//项目:Therectangular构造函数的重载举例//定义无参数的构造函数Rectangular::Rectangular(void){ fLength=6; fWidth=6; fHeight=8;}//项目:Therectangular构造函数的重载举例//定义带参数的构造函数,//建立指定长、宽和高的长方体Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}//项目:Therectangular构造函数的重载举例//定义求长方体的体积的函数doubleRectangular::Volume(void){

returnfLength*fWidth*fHeight;}//项目:Therectangular构造函数的重载举例int_tmain(intargc,_TCHAR*argv[]){ //制造汽车,并指定汽车的长、宽和高分别为1,3,8 RectangularCar(1,3,8);

//输出汽车的体积 cout<<"汽车的体积为"<<Car.Volume()<<"立方米。"<<endl;

//制作桌子,并指定桌子的长、宽和高分别为1,6,8 RectangularTable(1,6,8);

//输出桌子的体积 cout<<"桌子的体积为"<<Table.Volume()<<"立方米。"<<endl;

//建造房子,不指定房子的长、宽和高 RectangularHouse;

//输出房子的体积 cout<<"房子的体积为"<<House.Volume()<<"立方米。"<<endl; return0;}构造函数的重载说明无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。对于每一个对象来说,建立对象时只执行其中一个构造函数,279.2析构函数析构函数(destructor)也是一个特殊的成员函数它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号当对象的生命期结束时,会自动执行析构函数289.2析构函数的执行时机自动局部对象释放前自动执行析构函数static局部对象在函数调用结束时对象并不释放,也不调用析构函数,在main函数结束或调用exit时释放全局对象,在程序的流程离开其作用域时释放299.2析构函数的执行时机用new运算符动态地建立对象,用delete运算符释放该对象时,先调用该对象的析构函数。注意:析构函数并不是删除对象,而是在撤销对象占用的内存之前完成一些工作没有返回及参数,并且不能被重载30析构函数用法举例#include<iostream>#include<string>usingnamespacestd;classStudent//声明学生类Student{

public:

//声明带2个默认参数的构造函数 Student(intNumber=138168,string

Name="JackDonson"); ~Student(void);

//声明析构函数

31析构函数用法举例protected://以下为类中的保护部分

//保护成员变量保存学生的准考证号

intnNumber;

stringstrName;//保护成员变量保存学生姓名public://以下为类中的公用部分

//学生说话

voidSpeak(void);};//类的声明结束32析构函数用法举例//定义带2个默认参数的构造函数Student::Student(intNumber,stringName):nNumber(Number),strName(Name){

//输出信息学生strName入学... cout<<"学生"<<strName<<"入学..."<<endl;}33析构函数用法举例//定义析构函数Student::~Student(void){

//输出信息学生strName毕业... cout<<"学生"<<strName<<"毕业..."<<endl;}34析构函数用法举例//学生说话voidStudent::Speak(void){

//输出提示信息cout<<"Iam"<<strName;cout<<".Mynumberis"<<nNumber<<endl;}35int_tmain(intargc,_TCHAR*argv[]){

//入学2个学生Jack和RoseStudentJack,

Rose(138668,"RoseDonson");

//调用学生Jack的公共成员函数SpeackJack.Speak();

//调用学生Jack的公共成员函数SpeackRose.Speak(); return0;}//项目:Studentspeacks程序运行结果如下:学生JackDonson入学…

//执行Jack的构造函数学生RoseDonson入学…

//执行Rose的构造函数//执行Jack的Speaks函数IamJackDonson.Mynumberis138168//执行Rose的Speaks函数IamRoseDonson.Mynumberis138668学生JackDonson毕业…

//执行Jack的析构函数学生RoseDonson毕业…

//执行Rose的析构函数调用构造函数和析构函数的顺序38调用析构函数的次序正好与调用构造函数次序相反先构造的后解析;后构造的先解析调用构造函数和析构函数的顺序39调用析构函数的次序正好与调用构造函数次序相反先构造的后解析;后构造的先解析9.4对象数组对象数组的每一个元素都是同类对象如果构造函数有多个参数,在定义对象数组时应当在花括号中分别写出构造函数并指定实参StudentStudents[3]={//调用第1个元素的构造函数,为它提供3个实参Student(1001,18,87),//调用第2个元素的构造函数,为它提供3个实参Student(1002,19,76),//调用第3个元素的构造函数,为它提供3个实参Student(1003,18,72)};40对象数组的使用方法#include<iostream>#include<string>usingnamespacestd;//声明长方体类classRectangular{protected:

stringstrName;//长方体的名称

//长方体的长

doublefLength;

//长方体的宽

doublefWidth;

//长方体的高

doublefHeight;41public: //声明带4个默认参数的构造函数,

//建立指定名称、长、宽和高的长方体

Rectangular(stringName="Car",doublelength=6,doublewidth=6,doubleheight=8); ~Rectangular(void); //声明取长方体的名称的函数

stringGetName(void); //声明求长方体的体积的函数

doubleVolume(void);};//项目:Somerectangulars//定义带4个默认参数的构造函数,//用参数的初始化表初始化名称、长、宽和高Rectangular::Rectangular(stringName,doublelength,doublewidth,doubleheight):strName(Name),fLength(length),fWidth(width),fHeight(height){}//项目:SomerectangularsRectangular::~Rectangular(void){}//定义取长方体的名称的函数stringRectangular::GetName(void){

returnstrName;}//定义求长方体的体积的函数doubleRectangular::Volume(void){

returnfLength*fWidth*fHeight;}int_tmain(intargc,_TCHAR*argv[]){

//制造3部汽车 RectangularCars[3]={Rectangular("奔驰",1,3,8),Rectangular("凯迪拉克",1,6,8),Rectangular("保时捷",6,6,8)};

//输出3部汽车的名称和体积 for(intIndex=0;Index<3;Index++) {

cout<<Cars[Index].GetName()<<"的体积为"<<Cars[Index].Volume()<<"立方米。"<<endl; } return0;}

//项目:Somerectangulars9.4对象指针(指向对象的指针)如果有一个类:classClock//声明钟类Clock{

protected:intnHour;intnMinute;intnSecond;public:voidGiveTheCorrectTime();};46指向对象的指针voidTime∷GiveTheCorrectTime(){cout<<nHour<<":"<<nMinute<<":"<<nSeccond<<endl;}Clockclock;//制作一个钟clock//声明pClock为指向钟的指针变量,//并将钟clock的地址初始化指针变量pClockClock*pClock=&clock;//这样,pClock就是指向钟的指针变量,它指向钟clock。47指向对象的指针定义指向类对象的指针变量的一般形式为类名*对象指针名[=&同一类的对象名];//可以通过对象指针访问对象和对象的成员。如*pClock//pClock所指向的对象,即钟clock//调用pClock所指向的对象中GiveTheCorrectTime//公共成员函数,即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//调用pt所指向的对象中的GiveTheCorrectTime//公共成员函数,即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();48指向对象的指针定义指向类对象的指针变量的一般形式为类名*对象指针名[=&同一类的对象名];//可以通过对象指针访问对象和对象的成员。如*pClock//pClock所指向的对象,即钟clock//调用pClock所指向的对象中GiveTheCorrectTime//公共成员函数,即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//调用pt所指向的对象中的GiveTheCorrectTime//公共成员函数,即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();49指向对象数据成员的指针和定义指向普通变量的指针变量方法相同定义指向对象数据成员的指针变量的一般形式为数据类型名*指针变量名;例如:

int*pInteger;//定义指向整型数据的指针变量50指向对象成员函数的指针定义指向普通函数的指针变量方法:类型名(*指针变量名)(参数表列)例如:void(*p)(int,int);p=fun;(*p)(a,b);定义指向公用成员函数的指针变量:数据类型名(类名::*指针变量名)(参数表列);例如:void(Clock∷*pFunction)();pFunction=&Colck::GiveTheCorrectTime;一般形式:指针变量名=&类名∷成员函数名;51例.有关对象指针的使用方法。#include<iostream>usingnamespacestd;classClock//声明钟类{public:

//声明有3个默认参数的钟类构造函数

Clock(intHour=1,intMinute=3,intSecond=8); ~Clock(void);//项目:Apointeroftimesignalclockprotected:

//钟的时

intnHour;

//钟的分

intnMinute;

//钟的秒

intnSecond;public:

//校正

voidCheck(void);

//报时

voidGiveTheCorrectTime(void);};//项目:Apointeroftimesignalclock//定义有

温馨提示

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

评论

0/150

提交评论