您好,欢迎来到智榕旅游。
搜索
您的当前位置:首页指导书_实验5

指导书_实验5

来源:智榕旅游
实验5类与对象的应用(4学时)

一、实验目的:

1掌握类和对象的概念、定义和使用方法。

2掌握不同特性对象成员的访问方法,以及this指针的概念和使用方法。

3掌握构造函数和析构函数的使用方法。 二、实验内容:

1.写出下列程序的执行结果,然后上机进行验证。 #include #include class X { int n;

public: X( );

X(int a);

~X( ); };

X::X( ):n(3) {

cout<<\"调用构造函数 X()\"<}

X::X(int a ):n(6) { }

X::~X() { }

void main() { X a;

cout<<\"调用析构函数 \"<cout<<\"调用构造函数 X(int a)\"<cout<<\"------a-------\"<X b(7);

cout<<\"------b--------\"<通过设置断点,以单步执行的方式跟踪构造函数、析够函数的执行顺序。所谓断点就是程序运行时需要暂时停止执行的语句。程序员可以为程序需要观察的语句设置断点,以“单步执行”的方式跟踪和检查程序当前的各种状态值。

在C++程序文件中设置断点,并以“单步执行”的方式跟踪程序执行的过程和检查变量的值的操作步骤是:

 在主窗口中打开源文件“ex10_8”,并对该文件进行编译和链接;

 把光标移动到需要设置断点的语句,单击鼠标右键,弹出如图10-8所示的快捷菜单,单击“Insert/Remove Breakpoint”菜单项,在语句左边空白处出现一个红色的圆点,再选择一次为为取消断点。也可以选择工具栏上的

按钮,单击一次设置断

点,再单击一次为取消断点。注意,断点语句应该是有变量的语句。可以在程序中设置多个断点,但断点不能太多。

图10-8 添加断点的快捷菜单

 单击“组建/开始调试/Go”菜单项或按F5功能键,如图10-9所示,或按工具栏上的

按钮,系统开始执行程序。进入调

试状态后,菜单栏上的“组建”菜单项变为“调试”菜单项,主窗口中出现调试工具栏(如果没有出现的化,将鼠标位于工具栏上单击右键,在下拉菜单项中选择“调试”,调试工具栏就会出现)。执行到断点语句“cout<<\"调用构造函数 X()\"< 若要停止调试程序,可以单击“调试/Stop Debugging”菜单项,

或单击工具栏上的按钮,系统停止调试程序。

图10-9 单步调试

图10-10 单步调试状态下的主窗口

⑵要求

 在上述程序中设置断点,观察构造函数、析构函数的执行顺序

及变量n值的变化;

 对象作为类的数据成员,测试构造函数和析构函数的调用顺序;定义类CTs类,有两个数据成员,分别是类CStudent、类CTeacher的对象。定义如下: classCStudent { public: };

classCTeacher { public:

CTeacher() //教师类构造函数 {

CStudent() //学生类构造函数 { }

~CStudent() //学生类析构函数 { }

cout<<\"denstructing student\"<};

}

cout<<\"constructing teacher\"<~CTeacher() //教师类析构函数 { }

cout<<\"destructing teacher\"<class CTs {

CStudent student; //学生对象数据成员

CTeacher teacher; //教师对象数据成员 public:

CTs() //教师学生类构造函数 }; { }

~CTs() //教师学生类析构函数 { }

cout<<\"destructing ts\"<⑶写实验报告

2.定义一个学生通讯录类,数据成员包括:学号、姓名、院系、通讯地址、电话;成员函数包括:输出各个数据成员的值,分别设置和获取各个数据成员的值。 ⑴提示

由于姓名、院系和通讯地址的数据长度是可变的,可使用动态的数据结构。电话可以用一个字符数组存放。将数据成员均定义为私有的。用一个成员函数输出所有的成员数据,用五个成员函数分别设置学号、姓名、院系、通讯地址和电话,另用五个成员函数分别获取学号、姓名、院系、通讯地址和电话。

class CStudent {

int number; //学号 char *p_name; //姓名 char *p_school; //院系 char *p_address; //通讯地址 char tel[15]; //电话 public:

void show(); //输出数据成员

CStrudent(intun,char *pn,char *ps,char *pa,char t[]);//构造函数 void setname(char *name) //设置姓名 {

if(p_name ) delete [ ] p_name; //释放存储空间

p_name = new char[strlen(name)+1]; //申请存储空间 strcpy(p_name,name); }

void setnumber(int number); //设置学号 void setschool(char *school); //设置院系

void setaddress(char *address); //设置通讯地址 void settel(char *mailnum); intgetnumber(); //获取学号 char *getname(); //取姓名 char *getscool(); //取学校 char *getaddress(); //取电话号码 char *gettel(); }; ⑵要求

 完成上述成员函数的定义;

 在类中要求定义拷贝构造函数定义,大家思考为什么?  用以下数据测试程序的正确性:定义类对象

CStudent

s(2004005张三工学院算机系四川雅安雨城区新康路49号邮编625014 0123344);

//取邮编

//设置电话

 输出对象s的数据成员的值;

 调用成员函数,修改对象s中的数据成员值; ⑶写出实验报告。 3.对象作为函数参数 ⑴提示

由于类是一个数据类型,也可以将类作为参数传递给函数,参数传递遵循传值(或传地址)的方式,这同所有其他的数据类型是相同的。类对象作形参有3种方式: 对象本身做参数(传值),传对象副本 对象引用做参数(传地址),传对象本身 对象指针做参数(传地址),传对象本身

注意:当函数参数是类类型时,调用函数时用实参初始化形参,要调用拷贝构造函数。通常默认的拷贝构造函数就可以实现实参到形参的复制,若类中有指针类型时,用户必须定义拷贝构造函数,实现实参到形参的复制。参考程序如下:

#include

#include #include classCStrSub {

char *str; public:

CStrSub(char *s); CStrSub(CStrSub&); ~ CStrSub(); void set(char *s); void show() {

cout<} };

CStrSub::CStrSub(char *s) {

str=new char[strlen(s)+1]; if(!str) {

cout<<\"申请空间失败!\"<strcpy(str,s); }

CStrSub::CStrSub(CStrSub&temp) {

str=new char[strlen(temp.str)+1]; if(!str) {

cerr\"申请空间失败!\"<strcpy(str,temp.str); }

CStrSub:: ~ CStrSub( ) {

if(str!=NULL) delete [ ]str; }

voidCStrSub::set(char *s) {

delete [ ]str;

str=new char[strlen(s)+1]; if(!str) {

cout<<\"申请空间失败!\"<strcpy(str,s); }

CStrSubinput(CStrSub temp) {

char s[20];

cout<<\"输入字符串:\"<>s; temp.set(s); return temp; }

void main() {

CStrSuba(“hello”); a.show( );

CStrSub b=input(a); a.show( ); b.show( ); } ⑵要求

 修改input(CStrSub temp)函数,对象引用、对象指针作为函数参数时,程序执行结果与对象作为函数参数有什么不同。 (3)撰写实验报告

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- zrrp.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务