四川大学计算机学院C++面向对象程序设计实验指导.docx
《四川大学计算机学院C++面向对象程序设计实验指导.docx》由会员分享,可在线阅读,更多相关《四川大学计算机学院C++面向对象程序设计实验指导.docx(59页珍藏版)》请在冰点文库上搜索。
四川大学计算机学院C++面向对象程序设计实验指导
C++面向对象程序设计
实验指导
四川大学计算机学院
C++语言面向对象程序设计是一门实践性很强的课程,学好这门课程离不开实验这一重要环节。
学生不仅应具有扎实的理论知识,还要通过坚持不懈地阅读程序、编程练习、程序调试、程序改错等环节的训练,才能真正掌握所学知识,提高编程水平。
对于初学者,可能会看程序但不会编写,程序调试时出现了问题不会纠错,这些都是正常现象,实际还是编程训练不够,只要勤学多练,最后一定可以取得令人满意的效果。
包括5个实验,每个实验都包括实验目的、实验内容、实验提示与实验步骤。
实验内容一般都包含有阅读程序与调试程序,程序改错,程序填空与编写程序方面的题目,这些题目也是C++面向对象程序设计考试要涉及的题型,因此做好实验对考试有极大的帮助;实验提示信息中有编程提示、重要内容提示或者出错信息提示;实验步骤以一个实际题目为例给出具体而实用的指导,让便让初学者不至于面对实验题目而束手无策,希望读者在实验中的能够学有所思,有所启迪。
实验1类和对象
1.1实验目的
1.掌握类的定义和使用方法,掌握类对象的声明和使用方法。
2.掌握对象的初始化和赋值的方法。
3.了解成员函数的特性、友元。
4.静态成员的使用方法。
5.理解和掌握this指针的用法。
6.理解和掌握const类型数据的使用。
1.2实验工具与准备工作
在开始实验前,应回顾或复习相关内容。
需要一台主算机,其中安装有VisualC++6.0、VisualC++2005、VisualC++2005Express、Dev-C++或MinGWDeveloperStudio等集成开发环境软件。
1.3实验内容
1.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
//直角坐标类
classPoint
{
private:
//数据成员:
intx,y;//横坐标与纵坐标
public:
//公有函数:
Point(inta,intb):
x(a),y(b){}//构造函数
voidSet(inta,intb);//设置坐标值
intGetX()const{returnx;}//返回横坐标
intGetY()const{returny;}//返回纵坐标
};
//直角坐标类及相关函数的实现部分
voidPoint:
:
Set(inta,intb)//设置坐标值
{
x=a;//横坐标
y=b;//纵坐标
}
voidShow(constPoint&pt)//显示坐标值
{cout<intmain(void)//主函数main(void)
{
Pointa[5]={Point(0,0),Point(1,1),Point(2,2),Point(3,3),Point(4,4)};//由对象组成的数组
Point*p=a;//p指向数组a
p->Set(5,9);//设置坐标值
a[3].Set(6,8);//设置坐标值
for(inti=0;i<5;i++)
{//依次显示各对象的坐标值
Show(*p++);
}
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
2.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
//日期类
classDate
{
private:
//数据成员:
intmonth,day,year;//年月日
public:
//公有函数:
Date(intm=1,intd=1,inty=2008);//构造函数
//友元
friendvoidShow(constDate&dt);//显示日期
};
//日期类及相关函数的实现部分
Date:
:
Date(intm,intd,inty)//由m(月),d(日)和y(年)构造对象
{
this->month=m;//月
this->day=d;//日
this->year=y;//年
}
voidShow(constDate&dt)//显示日期
{
cout<
}
intmain(void)//主函数main(void)
{
Dated1(6,8,2008),d2(6,18),d3(5),d4;//定义日期对象
Show(d1);//显示d1
Show(d2);//显示d2
Show(d3);//显示d3
Show(d4);//显示d4
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
3.程序填空。
下面程序主要测试静态成员的使用方法,请完成程序。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
//测试静态成员类
classTest
{
private:
//数据成员:
staticintcount;//对象数
public:
//公有函数:
Test(){count++;}//构造函数,实现对对象进行计数
staticvoidShow(){cout<<"共有"<"<};
[1]count=0;//为静态数据成员赋初值
intmain(void)//主函数main(void)
{
Testobj1,obj2,obj3;//定义对象
Test:
:
Show();//显示对象数
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
4.改正下面程序中的错误,使其能正常运行。
//文件名:
main.cpp//1
#include//预处理命令//2
usingnamespacestd;//使用标准命名空间std//3
//4
//测试构造函数与析构函数类//5
classTest//6
{//7
public:
//8
//公有函数:
//9
voidTest(){cout<<"构造函数"<void~Test(){cout<<"析造函数"<};//12
//13
intmain(void)//主函数main(void)//14
{//15
Testobj;//定义对象//16
//17
system("PAUSE");//调用库函数system(),输出系统提示信息//18
return0;//返回值0,返回操作系统//19
}//20
5.编写设计一个People(人)类。
该类的数据成员有年龄(age)、身高(height)、体重(weight)和人数(num),其中人数为静态数据成员,成员函数有构造函数(People)、进食(Eatting)、运动(Sporting)、睡眠(Sleeping)、显示(Show)和显示人数(ShowNum)。
其中构造函数由已知参数年龄(a)、身高(h)和体重(w)构造对象,进食函数使体重加1,运动函数使身高加1,睡眠函数使年龄、身高、体重各加1,显示函数用于显示人的年龄、身高、体重,显示人数函数为静态成员函数,用于显示人的个数。
假设年龄的单位为岁,身高的单位为厘米,体重的单位为市斤,要求所有数据成员为protected访问权限,所有成员函数为public访问权限,在主函数中通过对象直接访问类的所有成员函数。
*6.定义一个描述学生(Student)基本情况的类,数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(mathTotalScore)和英语总成绩(englishTotalScore)。
其中姓名定义为长度为18的字符数组,其它数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员,函数成员包括构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数,数学总成绩,英语总成绩;要求所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。
1.4实验提示
1.通过构造函数生成对象为对象数组赋初值,属于基本输出cout方面的题目,应注意换行,语句
Point*p=a;//指向p指向数组a
p->Set(5,9);//设置坐标值
用于修改对象数组的a[0]的值,而语句
a[3].Set(6,8);//设置坐标值
用于修改对象数组的a[3]的值。
2.注意缺省参数值的使用;对于私有数据成员,可使用友元进行访问。
3.中静态数据成员赋初值的一般形式如下:
数据类型类名:
:
静态数据成员名=初值;
参考答案为:
[1]intTest:
:
4.构造函数与析构函数不能有返回值类型,因此应去掉第10行和第11行的void。
5.只要按题目要求编程实现即可,建议将比较短的函数在类体中实现,比较长的函数在类体外实现。
6.可仿照第5题编程实现,当然学生现实后还可灵活处理,比如定义学生数组存储学生信息,由count的值作为学号(此时构造函数的参数中不需要学号的信息)。
1.5实验步骤
以实验内容第5题为例说明实验步骤。
具体实现步骤如下:
1.建立工程exp2_5。
2.建立源程序文件main.cpp,具体内容如下:
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
//人(people)类
classPeople
{
protected:
//数据成员:
intage;//年龄
intheight;//身高
intweight;//体重
staticintnum;//人数
public:
//公有函数:
People(inta,inth,intw);//构造函数
voidEatting(){weight++;}//进食使体重加1
voidSporting(){height++;}//运动使身高加1
voidSleeping();//睡眠
voidShow()const;//显示人的信息
staticvoidShowNum()//显示人数
{cout<<"人数:
"<};
intPeople:
:
num=0;//初始化静态数据成员num
//人(people)类的实现部分
People:
:
People(inta,inth,intw):
age(a),height(h),weight(w)
{num++;}//由已知信息构造对象,人数num将自加1
voidPeople:
:
Sleeping()//睡眠
{
age++;//睡眠使年龄加1
height++;//睡眠使身高加1
weight++;//睡眠使体重加1
}
voidPeople:
:
Show()const
//显示人的信息
{
cout<<"第"<"<cout<<"年龄:
"<cout<<"身高:
"<cout<<"体重:
"<cout<}
intmain(void)//主函数main(void)
{
Peopleobj1(8,120,60);//定义对象
obj1.Eatting();//进食
obj1.Sporting();//运动
obj1.Sleeping();//睡眠
obj1.Show();//显示信息
Peopleobj2(18,170,108);//定义对象
obj2.Eatting();//进食
obj2.Sporting();//运动
obj2.Sleeping();//睡眠
obj2.Show();//显示信息
People:
:
ShowNum();//显示人数
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
3.编译及运行程序。
1.6测试与结论
以实验内容第5题为例进行测试,测试时,屏幕显示如下:
第1个人:
年龄:
9岁
身高:
122厘米
体重:
62市斤
第2个人:
年龄:
19岁
身高:
172厘米
体重:
110市斤
人数:
2
请按任意键继续...
从上面的屏幕显示,可知本程序满足实验内容第5题的要求。
实验2继承与派生
2.1实验目的
1.熟练掌握类的继承,能够定义和使用类的继承关系。
2.掌握派生类的声明与实现方法。
3.掌握类构造函数的初始化列表与作用域分辨符的使用方法。
4.理解虚基类在解决二义性问题中的作用。
2.2实验工具与准备工作
在开始实验前,应回顾或复习相关内容。
需要一台主算机,其中安装有VisualC++6.0、VisualC++2005、VisualC++2005Express、Dev-C++或MinGWDeveloperStudio等集成开发环境软件。
2.3实验内容
1.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
classA
{
public:
//公有函数:
A(){cout<<"构造A"<~A(){cout<<"析构A"<};
classB:
publicA
{
public:
//公有函数:
B(){cout<<"构造B"<~B(){cout<<"析构B"<};
classC:
publicB
{
public:
//公有函数:
C(){cout<<"构造C"<~C(){cout<<"析构C"<};
intmain(void)//主函数main(void)
{
Cobj;//定义对象
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
2.先阅读下列程序,写出执行结果。
然后输入程序,调试程序,比较结果的正确性。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
classA
{
protected:
//数据成员:
inta;//数据成员
public:
//公有函数:
A(intx):
a(x){}//构造函数
voidShow()const{cout<};
classB
{
protected:
//数据成员:
intb;//数据成员
public:
//公有函数:
B(intx):
b(x){}//构造函数
voidShow()const{cout<
};
classC:
publicA,publicB
{
public:
//公有函数:
C(intx,inty):
A(x),B(y){}//构造函数
voidShow()const//显示b之值
{cout<};
intmain(void)//主函数main(void)
{
Cobj(5,18);//定义对象
obj.Show();//显示相关信息
obj.A:
:
Show();//显示相关信息
obj.B:
:
Show();//显示相关信息
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
3.程序填空。
下面程序主要测试类构造函数的初始化列表与作用域分辨符,请完成程序。
//文件名:
main.cpp
#include//预处理命令
usingnamespacestd;//使用标准命名空间std
classA
{
private:
//数据成员:
inta;//数据成员
public:
//公有函数:
A(intx):
[1]{}//构造函数
voidShow()const//显示a之值
{cout<<"a:
"<};
classB:
publicA
{
protected:
//数据成员:
intb;//数据成员
public:
//公有函数:
B(intx,inty):
[2],b(y){}//构造函数
voidShow()const//显示相关信息
{
[3]Show();//调用基类A的成员函数Show()
cout<<"b:
"<
}
};
intmain(void)//主函数main(void)
{
Bobj(5,18);//定义对象
obj.Show();//显示相关信息
system("PAUSE");//调用库函数system(),输出系统提示信息
return0;//返回值0,返回操作系统
}
4.改正下面程序中的错误,使其能正常运行。
//文件名:
main.cpp//1
#include//预处理命令//2
usingnamespacestd;//使用标准命名空间std//3
//4
//基类Base//5
classBase//6
{//7
private:
//8
//数据成员:
//9
intm;//数据成员//10
//11
public:
//12
//公有函数:
//13
Base(inta):
m(a){}//构造函数//14
Base(constBase&cop