当前位置:首页 >> 信息与通信 >>

实验2 构造函数和析构函数


实验 2

构造函数与析构函数的用法

实验 2 构造函数与析构函数的用法
2.1 实验目的 1.掌握定义构造函数、重载构造函数的方法 2.理解构造函数的作用 3.掌握定义析构函数的方法,理解析构函数的作用 4.加深理解拷贝构造函数的作用和用途 2.2 实验内容与步骤 构造函数用于初始化对象,通过重载构造函数可实现多种方法初始化对

象。构造函数是 系统产生对象时自动调用的。析构函数用于撤消对象时作收尾工作。当对象中的成员含有用 new 运算符申请的存储空间时,必须显式定义析构函数。 1.上机实验题一 将实验 10 的第一个上机实验题中的成员函数 Init 改为构造函数,将成员函数 FreeSpace 改为析构函数。增加一个缺省的构造函数,使指针 pName,pSchool 和 pNum 的初值为 0,使 Box 包含空字符串。 ⑴分析 缺省的构造函数完成数据成员的初始化, 根据实验题的要求, 该缺省的构造函数可以是: COMMU() //缺省的构造函数 { pName = pSchool = pNum =0; Box[0] = 0; } 用构造函数 COMMU 代替成员函数 Init 的功能,只要将函数名 Init 改为 COMMU,即: COMMU(char *name,char *unit,char *num,char *b) { //重载构造函数 pName = new char [strlen(name)+1]; strcpy(pName,name); pSchool = new char [strlen(unit)+1]; strcpy(pSchool,unit); pNum = new char [strlen(num)+1]; strcpy(pNum,num);strcpy(Box,b); }

C++面向对象程序设计 实验指导

用析构函数~COMMU 代替成员函数 FreeSpace,该析构函数为: ~COMMU( ) //析构函数 { if(pName) delete [] pName; if(pSchool) delete [] pSchool; if(pNum) delete [] pNum; } 完整的参考程序为: #include <iostream.h> #include <string.h> class COMMU{ char *pName; char *pSchool; char *pNum; char Box[10]; public: void Print(void) { cout<<"姓名:"<<pName<<'\t'; cout<<"单位:"<<pSchool<<'\t'; cout<<"电话号码:"<<pNum<<'\t'; cout<<"邮编:"<<Box<<'\n'; } COMMU(char *,char *,char *,char *); COMMU(); ~COMMU(); void SetName(char *name) { if(pName ) delete [ ] pName; pName = new char[strlen(name)+1]; strcpy(pName,name); } void SetScool(char *unit) { if( pSchool ) delete [] pSchool; pSchool = new char[strlen(unit)+1]; strcpy(pSchool,unit); //置学校名称 //输出数据成员

//姓名,数据成员为私有的 //单位 //电话号码 //邮编

//释放存储空间 //申请存储空间

实验 2

构造函数与析构函数的用法

} void SetNum(char *num) { if( pNum ) delete [ ] pNum; pNum = new char[strlen(num)+1]; strcpy(pNum,num); } void SetBox(char *mailnum) { strcpy(Box,mailnum); } char *GetName(void) { return pName; } char *GetScool(void ) { return pSchool; } char *GetNum(void) { return pNum; } char *GetBox(void) { return Box; } }; COMMU :: COMMU() { pName = pSchool = pNum =0; Box[0] = 0;

//置电话号码

//置邮编

/取姓名

//取学校

//取电话号码

//取邮编

//缺省的构造函数

} COMMU::COMMU(char *name,char *unit,char *num,char *b) { //重载构造函数 pName = new char [strlen(name)+1]; strcpy(pName,name); pSchool = new char [strlen(unit)+1]; strcpy(pSchool,unit);

C++面向对象程序设计 实验指导

pNum = new char [strlen(num)+1]; strcpy(pNum,num); strcpy(Box,b); } COMMU::~COMMU( ) { if(pName) delete [] pName; if(pSchool) delete [] pSchool; if(pNum) delete [] pNum; } void main(void ) { COMMU c1("张建国","南京大学","025-85595638","210024"); COMMU c2("李国强","南京工业大学","025-85432455","210015"); c1.Print(); c2.Print(); c1.SetName("王国安"); cout<<c1.GetName()<<'\n'; c1.SetScool("南京理工大学"); cout<<c1.GetScool()<<'\n'; c1.SetNum("025-88755635"); cout<<c1.GetNum()<<"\n"; c1.SetBox("210090"); cout<<c1.GetBox()<<"\n"; c1.Print(); } ⑵上机要求 在程序的基础上,增加 E_mail 地址和手机号码的数据成员。试定义一个对象数组 COMMU stu[10],完成数组对象的初始化,并制表输出通讯录。输入九个同学组成的通讯 录,测试程序的正确性。 ⑶写出实验报告。 2.上机实验题二 下面定义一个存放字符串的线性表的类: class LinearStr{ int Size; int Point; char **StrP; public: LinearStr(int n=100) { //字符串指针数组的大小 //字符串指针数组中实际存放的元素个数 /指向字符串指针数组的指针 //析构函数

实验 2

构造函数与析构函数的用法

if( n==0) { Size= Point=0;StrP =0; } else { Size=n; Point=0; StrP= new char * [n]; for( int i=0; i<n;i++) StrP[i]=0; } } ~LinearStr() { for(int i =0; i<Point;i++) if(StrP[i] ) delete [] StrP[i]; if( StrP ) delete [ ] StrP; } ……;

//为线性表申请空间

}; 补充成员函数和测试程序,构成一个完整的程序。 ⑴分析 要有一个成员函数输出字符串线性表中的所有字符串,有一个成员函数将一个字符串加 入到字符串线性表中,有一个成员函数从表中删除一个指定的字符串,有一个成员函数从表 中查找一个字符串。至少增加以上四个成员函数。 输出表中的所有字符串的成员函数为: void { LinearStr::Print(void) cout<<"包含的字符串个数为:"<<Point<<"\n"; for(int i=0; i<Point; i++) cout<<StrP[i]<<'\n'; cout<<'\n'; } 将一个字符串加入到线性表中时,若线性表不满,只要为存放字符串申请空间后,完成 字符串的拷贝;若线性表已满,先要为新线性表重新申请空间,并将原表拷贝到新表中,然 后将字符串加入到新的线性表中。实现这一功能的成员函数为: void LinearStr::AddStr(char *s) { if( Point < Size ) { StrP[Point] = new char [strlen(s)+1];

//线性表不满 //为存放字符串申请空间

C++面向对象程序设计 实验指导

strcpy(StrP[Point],s); Point++; } else { char **p; p= new char * [Size+10]; for(int i=0; i< Point ; i++ ) p[i] = StrP[i]; delete [ ] StrP; StrP = p; Size +=10; StrP[Point] = new char [strlen(s)+1]; strcpy(StrP[Point],s); Point++; }

//将字符串拷贝到线性能表中 //表中的字符串个数增加一个 //线性表已满 //申请一个新的线性表 //A //释放原线性表

//为存放字符串申请空间 //将字符串拷贝到线性能表中

} A 行的循环语句完成线性表的拷贝, 使新线性表中的指针指向原线性表中保存的字符串。 由于将新的字符串加入到线性表中动作是相同的,上面的函数可改进为: void LinearStr::AddStr(char *s) { if( Point == Size ) { char **p; Size +=10; p= new char * [Size]; for(int i=0; i< Point ; i++ ) p[i] = StrP[i]; delete [ ] StrP; StrP = p; } StrP[Point] = new char [strlen(s)+1]; strcpy(StrP[Point],s); Point++; } 从线性表中查找一个字符串时, 只要依次比较线性表中的各个字符串。 找到时返回该字 符串在线性表中的序号,否则返回-1。该成员函数为: int { LinearStr::seach(char * s ) for(int i= 0; i< Point; i++) if(strcmp(StrP[i],s ) == 0 ) return i;

//线性表满

实验 2

构造函数与析构函数的用法

return

-1;

//没有找到

} 要删除线性表中的一个字符串时,首先要在线性表中找到指定的字符串,然后释放该字 符串占用的存储空间,最后使表中被删除字符串之后的字符串依次上移一个位置。该成员函 数为: void { LinearStr::DeleteStr(char *s) for(int i= 0; i< Point; i++) if(strcmp(StrP[i],s ) == 0 ) break; if(i == Point) //表已查完,没有要删除的字符串 cout<<"表中没有要删除的字符串:"<<s<<'\n'; else { //要删除表中第 i 个字符串 delete [] StrP[i]; //释放该字符串占用的存储空间 for(int j = i; j < Point -1 ; j++) StrP[j] = StrP[j+1]; //表中的字符串依次上移一个位置

StrP[Point-1] = 0; Point --; //表中的字符串个数减少一个 cout<<"从线性表中已删除字符串:"<<s<<'\n'; } } 简化的完整的参考程序为: #include <iostream.h> #include <string.h> class LinearStr{ int Size; int Point; char **StrP;

//字符串指针数组的大小 //字符串指针数组中实际存放的元素个数 //指向字符串指针数组的指针

public: LinearStr(int n=100) { if( n==0) { Size= Point=0; StrP =0; } else { Size=n; Point=0; StrP = new char * [n]; for( int i=0; i<n;i++) StrP[i]=0; } } ~LinearStr() {

C++面向对象程序设计 实验指导

for(int i=0; i<Point;i++)if(StrP[i] ) delete [] StrP[i]; if( StrP ) delete [ ] StrP; } void Print(void); void AddStr(char *); int seach(char * ); void DeleteStr(char *); }; void { LinearStr::Print(void) cout<<"包含的字符串个数为:"<<Point<<"\n"; for(int i=0; i<Point; i++)cout<<StrP[i]<<'\n'; cout<<'\n'; } void LinearStr::AddStr(char *s) { if( Point == Size ) { char **p; p= new char * [++Size]; for(int i=0; i< Point; i++ ) p[i] = StrP[i]; delete [ ] StrP; StrP = p; } StrP[Point] = new char [strlen(s)+1]; strcpy(StrP[Point++],s); } int LinearStr::seach(char * s ) { for(int i= 0;i<Point;i++)if(strcmp(StrP[i],s)==0) return i; return -1; } void LinearStr::DeleteStr(char *s) { for(int i= 0; i< Point; i++)if(strcmp(StrP[i],s)==0)break; if(i== Point)cout<<"表中没有要删除的字符串:"<<s<<'\n'; else { delete [] StrP[i]; for(int j=i; j<Point-1; j++)StrP[j] = StrP[j+1]; StrP[--Point] = 0;

实验 2

构造函数与析构函数的用法

cout<<"从线性表中已删除字符串:"<<s<<'\n'; } } void main(void ) { LinearStr ls(5); ls.AddStr("We are students!"); ls.AddStr("You are students too!"); ls.AddStr("They are students too!"); ls.Print(); ls.DeleteStr("You are students too!"); ls.Print(); } ⑵上机要求 增加三个成员函数: 第一个成员函数输出线性表中指定的字符串,其函数原型为: void LinearStr::PrintOneStr(int j); 若 j<Point,则输出线性表中第 j 个字符串,否则输出“已出界!”。 第二个成员函数用指定的字符串替换线性表中的某一个字符串,其函数原型为: void ReplaceStr(char *s1, char *s2); 若在线性表中找到 s1 所指向的字符串,则将 s2 指向的字符串替换线性表中找到的字符串; 否则将 s2 指向的字符串加入到线性表中。提示:当在线性表中找到指定的字符串时,先释放 该字符串所占用的存储空间,然后为存放新串分配一个存储空间,再完成字符串的拷贝。 第三个是实现线性表拷贝的构造函数。 ⑶写出实验报告。 2.3 项目选作 创建一个 Employee 类,该类中有字符数组,表示姓名、街道地址和邮政编码。功能有 修改姓名、显示数据信息。使用构造函数初始化每个成员。显示函数打印信息。其中数据成 员为保护的,函数为公共的。


相关文章:
实验2 构造函数和析构函数
实验2 构造函数和析构函数_数学_自然科学_专业资料 暂无评价|0人阅读|0次下载|举报文档 实验2 构造函数和析构函数_数学_自然科学_专业资料。...
02实验二构造函数和析构函数
实验二 构造函数和析构函数 1、定义一个长方体类,其中数据成员包括 length、width、height;有成员函数如下:构造函 数(数据成员的初始化) ,cal(计算长方体体积...
实验2 构造函数和析构函数
实验2 构造函数与析构函数的用法 实验 2 构造函数与析构函数的用法 2.1 实验目的 1.掌握定义构造函数、重载构造函数的方法 2.理解构造函数的作用 3.掌握定义析...
实验5 构造函数和析构函数 2
实验5 构造函数和析构函数 2_数学_自然科学_专业资料。实验 5 构造函数和析构函数 二、实验内容 1、请按要求运行下列程序,并回答相关问题,从中体会构造函数的作...
C++实验三 构造函数和析构函数题目+答案
实验构造函数和析构函数 201322688 姓名: 杨弘 成绩: 班级:B135A2 学号: 一. 实验目的 1.理解构造函数和析构函数作用; 2.掌握各种类型的构造函数和析构...
实验2 构造函数和析构函数
实验 2 班级: 班级: 学号: 学号: 构造函数和析构函数姓名: 姓名: 成绩: 成绩: 1、实验目的 、(1)理解构造函数和析构函数作用; (2)掌握各种类型的构造函数...
实验11构造函数与析构函数实验报告
一、实验目的 1.熟悉类的构造函数和析构函数的概念。 2.学会类的构造函数和析构函数的使用方法。 3.体会对象与指针的关系及其使用方法。 二、实验环境 (调试...
C++面向对象程序设计实验二:构造函数与析构函数
C++面向对象程序设计实验二:构造函数与析构函数_计算机软件及应用_IT/计算机_专业资料。构造函数 C++面向对象程序设计实验二:构造函数与析构函数实验目的: (1) ...
实验三 构造函数和析构函数
4.掌握类的构造实验三、构造函数和析构函数 一、实验目的 1.掌握声明类的方法,类和类的成员的概念以及定义对象的方法。 2.初步掌握用类和对象编制基于对象的...
实验五 构造函数和析构函数
深刻领会构造函数和析构函数被调用的时间和特性,以及它们在程 序中的作用。 2、 实验内容 (1) 自定义一个类,并在其构造函数和析构函数中编写一段输出代码,在...
更多相关标签:
构造函数和析构函数 | 构造函数与析构函数 | 构造函数 析构函数 | c 构造函数和析构函数 | 构造函数调用析构函数 | c 构造函数析构函数 | 析构函数 | c 析构函数 |