《面向对象程序设计》实验指导书(实验二).pdf

上传人:白大夫 文档编号:5599458 上传时间:2020-06-21 格式:PDF 页数:13 大小:72.19KB
返回 下载 相关 举报
《面向对象程序设计》实验指导书(实验二).pdf_第1页
第1页 / 共13页
《面向对象程序设计》实验指导书(实验二).pdf_第2页
第2页 / 共13页
《面向对象程序设计》实验指导书(实验二).pdf_第3页
第3页 / 共13页
《面向对象程序设计》实验指导书(实验二).pdf_第4页
第4页 / 共13页
《面向对象程序设计》实验指导书(实验二).pdf_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《《面向对象程序设计》实验指导书(实验二).pdf》由会员分享,可在线阅读,更多相关《《面向对象程序设计》实验指导书(实验二).pdf(13页珍藏版)》请在三一文库上搜索。

1、实验二类与对象对象初始化、对象数据与指针 一、实验目的 1理解构造函数、析构函数的意义及作用,掌握构造函数、析构函数的定义及调用时间, 熟悉构造函数的种类; 2理解this 指针及使用方法,熟悉对象数组、对象指针、对象引用的定义及使用方法,熟 悉对象作为函数参数的使用方法; 3熟悉类与对象的应用及编程。 二、实验学时 课内实验: 2 课时课外练习: 2 课时 三 本实验涉及的新知识 构造函数与析构函数 在 C+ 中,提供了两个特殊的成员函数,即构造函数和析构函数。 构造函数用于对象的初始化,即在定义一个类对象时,计算机在给对象分配相应的存储单元 的同时,为对象的数据成员赋初值。 析构执行的是与

2、构造函数相反的操作,用于撤销对象的同时释放对象所占用的内存空间。 1构造函数 构造函数的定义 格式: 类名(形参表) 构造函数体 构造函数的调用 构造函数的调用是在定义对象时调用的。 格式:类名对象名(实参表); 类名对象名 =构造函数名(实参表); 说明 构造函数必须与类同名。 构造函数没有返回值,但不能在构造函数前加void 类型符(其他没有返回值的成员函数 必须加类型符void) 。 在实际应用中, 在定义类时通常应定义一至多个构造函数(重载 ),以对各数据成员进行初 始化;如果不给出构造函数,系统将自定义一个构造函数。 构造函数可以可以带参数,也可不带任何参数(称无参构选函数) ,还可

3、以使用缺省参数。 不能象普通成员函数一样单独调用。 2析构函数 析构函数的定义 格式: 类名( void) 析构函数体 析构函数的调用 析构函数是在撤销对象时自动调用的。 说明 . . 析构函数与构造函数的名字相同,但在其前面加上“”,如果未定义析构函数,系统将自 定义一个析构函数。 析构函数没有参数、没有返回值,也不能重载。 对于大多数类而言,可以缺省析构函数的定义,但是,当类的数据成员中使用指针变量, 在构造函数中用new 动态分配内存空间时,应显式定义析构函数,用delete 释放已分配的内存空 间。 3拷贝构造函数(复制构造函数) 拷贝构造函数的定义 格式: 类名( const 类名

4、目标对象名 (源对象名 ); 说明 拷贝构造函数无返回值,也不能有void。 如果不定义拷贝构造函数,系统会自定义一个拷贝构造函数,实现对数据成员的拷贝。 默认拷贝构造函数是一种浅拷贝,当在类中定义有指针数据成员,用new 分配内存空间 时,通常应显示定义相应的拷贝构造函数。 对象数组与对象指针 1对象数组 可以定义对象数组处理多个对象。 可以用缺省参数构造函数为对象数组赋初值。 2对象指针 可以使用指针来使用对象或对象数组。方法: 定义对象指针; 将指针指向某一对象(或对象数组); 用指针使用用对象(或对象数组元素):对象指针 -公有成员 3对象引用 可以定义对象的引用,其引用名即为对象的别

5、名。 4this 指针 C+提供了一个特殊的对象指针,称为this 指针。 this 指针为成员函数所属对象的指针,指向对象的首地址。 this 指针是一种隐含指针,隐含于每个类的成员函数中,即调用某成员函数时,都将自动 产生一个this 指针。 调用 this 指针格式: this-成员名 this 指针通常采用隐式调用,即在类内部直呼其名。 this 指针是系统自定义的,用户不能再定义 对象作为函数的参数 在 C+ 中,可以用对象作为函数的形参或实参。主要有以下形式: 1形参、实参均为对象,其参数的传递为对象的值,即为传值调用。 . . 2形参为对象指针,实参为对象指针或对象地址,其参数的

6、传递为对象的地址,即传址调 用。 3形参为对象引用,实参为对象,形参是实参对象的别名,即传址调用。 4形参、实参为对象指针或对象数组,为传址调用。 四、实验内容 验证及认知实验 按要求调试下列程序,并回答相关问题。 程序 1(exp_201.cpp) #include class Myclass public: Myclass (void) cout class A private: int a,b; public: A(void) a=0;b=0; A(int x1,int x2) a=x1;b=x2; A(A b=ob.b; cout class Myclass private: int

7、a,b; public: Myclass(int x1=0,int x2=0) a=x1;b=x2; coutprint(); void func3(Myclass public: person(char *pn);/ 构造函数声明 person(void); /析构函数声明 person(const person / 拷贝构造函数声明 char *get_name(void) return name; void print_name(void); ; :person(char *pn) /定义构造函数,为name 提供值 name= ; if(name!=NULL) ; :person(vo

8、id)/ 显示定义析构函数 delete name; :person(const person if(name!=NULL) ; void person:print_name(void) cout #include“hscore.h“/ 调入成绩score 类的定义头文件 void input(score *p,int n,int m); /普通函数:输入学生成绩 void print(score *p,int n,int m); /普通函数:输出学生成绩 score /普通函数:平均成绩计算 void sort(score *p,int n,int m);/普通函数:按平均成绩排序 void

9、 main(void) int n,m; coutn; coutm; score *p,aver; p= ; /动态数组:用于处理n 个学生成绩 if(p=NULL) coutxj; ; /为某个学生对象提供成绩 void print(score *p,int n,int m) /成绩输出函数 int i; for(i=0;iset_score(x,j) ; 处应为coutget_score(i)set_score(s,n) ; . . 处应为a= pj.get_aver() ; 处应为cout # include #include using namespace std; class res

10、ult private: int id; string name; float score5; float ave; public: result(int i,string n,float s5) float sum=0,max=s0,min=s0; int j; id=i; name.assign(n); for(j=0;jsj) min=sj; sum+=sj; ave=(sum-max-min)/5; float get_ave() return ave; int get_id() return id; string get_name() return name; void displa

11、y() int i; coutm; idsize=m; int *id;/ 用指针指向一个数组 id=new intidsize; /动态内存分配 vector aver; . . vector name; vector x(m,vector(5); coutidi; coutna; name.push_back(na); coutxij; cout0;j-) if(averj=0;i-) cout“ 第 “m-i“名 “ “idi“ “namei“ “averiendl; 四、实验收获与创新 自已拟定一个解决实际题目,分析并抽象为一个类,然后编写类的测试程序(类的定义放在 头文件中,测试程序用exp_207.cpp 保存) ,要求: 数据成员不少于三个,至少有一个数组成员或指针成员; 成员函数(方法)自定,但必须显示定义构造函数、析构函数、拷贝构造函数。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1