面向对象实验1讲解.docx
《面向对象实验1讲解.docx》由会员分享,可在线阅读,更多相关《面向对象实验1讲解.docx(31页珍藏版)》请在冰豆网上搜索。
面向对象实验1讲解
面向对象程序设计
实验指导书
黄建灯朱震
桂林电子科技大学信息科技学院
二〇一一年八月
目录
实验一熟悉VisualC++开发环境学会最简单的开发2
实验二类和对象
(一)5
实验三类和对象
(二)7
实验四String类的定义和使用10
实验五String类的定义和使用(续)12
实验六继承与派生14
实验七多态性与虚函数15
第八章输入输出流16
参考文献17
附录AC++保留字18
附录B运算符优先级19
附录CASCII字符集20
附录D运算符重载21
附录EANSI/ISO标准C++和标准C++中头文件命名规则22
附录FC++头文件23
附录G系统中数据类型长度28
实验一熟悉VisualC++开发环境学会最简单的开发
1.实验目的
熟悉VisualC++的开发环境;
了解如何编辑、编译、链接和运行一个C++程序;
2.实验内容
2.1熟悉VisualC++开发环境,学会创建一个新的工程;
1)进入系统,启动VisualC++环境;
2)创建一个新的工程
在VisualC++环境中,菜单File->New...,弹出一个对话框,提示新建(new);
弹出的对话框TAB缺省在Projects页面上,选择该页面的“Win32ConsoleApplication”,在右边的Projectname输入框中输入工程名字,点击“OK”弹出新建工程向导;
3)新建向导的第一步,要求选择:
●空白工程;
●简单应用程序;
●HELLOWORLD应用程序;
●支持MFC的应用程序;
这里我们首先选择第二项:
简单应用程序,点击“finish”。
4)工程建立完成,在开发环境左侧的TAB页面中,查看ClassView和FileView内都能看到什么?
在类视图中可以看到,“简单应用程序”只有一个全局函数main,这也是应用程序的入口,和C语言中的main函数含义相同。
在文件视图中可以看到,开发环境为“简单应用程序”提供了标准全局文件“StdAfx.h”和“StdAfx.cpp”,同时提供了应用程序的源文件ProjectName.cpp。
分别点击这三个文件,可以看到源代码只是给出了程序的框架。
5)在VisualC++环境中,关闭刚才新建的文件和工程,则没有了当前激活窗口,视图呈现灰色;
6)选中菜单File->RecentFiles,可以看到刚才新建的源文件,选中,则该源文件被打开。
这里可以保存最近使用过的4个(该参数可修改)文件,以便下次快捷打开。
7)选中菜单File->RecentWorkspaces,可以看到刚才新建的工程,选中,则该工程被打开。
这里可以保存最近使用过的4个(该参数可修改)工程,以便下次快捷打开。
2.2打开一个工作区
如果打开刚刚关闭的workspace,可以利用菜单中的recentworkspace;
如果要打开的workspace在recent中已经看不到了,就需要在“打开文件对话框”中,找到工作区的存放位置。
1.点击菜单File->Open...,弹出打开文件对话框;
2.找到工作区在磁盘上的存放位置;一般都有一个和工作区名字相同的文件夹,存放工作区文件、该工程的头文件、源文件和资源文件等等。
3.工作区文件是一个以.dsw为后缀的文件,因此在文件类型过滤中要注意包含;
4.看到打开文件对话框中有projectname.dsw,点击即可。
2.3编译运行“简单应用程序”,看看这个程序框架提供了什么?
1)编译有三种方法:
单击工具栏当中的Build图标;
单击菜单Build->Build;
使用快捷键F7;
2)运行有三种方法:
单击工具栏当中的Run图标;
单击菜单Build->Run;
使用快捷键F5;
“简单应用程序”没有提供任何实质性的功能,“pressanykeytocoontinue”就可以退出程序了。
2.4尝试编辑一个小的示范程序,并编译运行;
按照上面的方法新建一个源文件,输入下面代码:
#include
intmain()
{
cout<<”HelloWorld\n”;
cout<<”WelcometoC++Programming\n”;
cout<<”Thisismyfirstcppsourcefile\n”;
return0;
}
2.5了解VisualC++中的调试工具,学会设置断点和单步跟踪;
1)设置断点的方法:
首先将程序编译通过;
将光标置于要设置断点的代码行;
选择工具栏的Breakpoint图标(或者快捷键F9),一个圆点显示在行首,表明该行已经设置了断点,这是个开关动作,重复上述动作,断点被去掉,点击可以在增加断点和去掉断点之间切换;
2)运行程序,到断点处程序中断;
3)尝试单步跟踪,在程序设置断点后,运行进入Debug状态,菜单增加了Debug项,点击菜单Debug->StepOver(或者快捷键F10),每触发一次,程序运行一步;上面的小程序,每运行一步,打印一行,可以观察到单步跟踪的效果;
4)调试工具可以完成以下任务,大家可以在调试时尝试:
设置断点
单步跟踪
监视变量、寄存器和内存
查看汇编代码和调用堆栈
修改代码和变量值
2.6写一个短小的windows程序,体会消息触发机制;
1)创建一个新的“Win32ConsoleApplication”,在选项中选择helloworld应用程序;
2)点击“finish”完成创建工程,可以看到系统提供了程序框架,包括头文件、源文件和资源文件;
3)类视图中可以看到WinMain全局函数和WndProc全局函数;
4)编译运行,看看系统提供的helloworld应用究竟是什么?
5)点击左边的“WndProc”函数,右边的视图就跳到了这个函数相应的位置,在该函数的switch分支中增加:
caseWM_LBUTTONDOWN:
MessageBox(NULL,“pressedtheleftbuttonofmouse!
”,“Message”,NULL);
break;
编译运行,在窗口范围内,点击鼠标左键,看看有什么?
3.思考题
课后自己查资料,结合我们这次实验的实例,了解什么是消息触发机制。
实验二类和对象
(一)
1.实验目的
(1)掌握声明类的方法,类和类的成员的概念以及定义对象的方法。
(2)初步掌握用类和对象编制基于对象的程序。
(3)学习检查和调试基于对象的程序。
2.实验内容
(1)有以下程序:
#include
usingnamespacestd;
classTime
{public:
inthour;
intminute;
intsec;
};
intmain()
{Timet1;
cin>>t1.hour;
cin>>t1.minute;
cin>>t1.sec;
cout<"<"<return0;
}
改写程序,要求:
A)将数据成员改为私有的;
B)将输入和输出功能改为成员函数实现;
C)在类体内定义成员函数。
然后编译和运行程序。
请分析什么成员应指定为公有、什么指定我私有的?
什么函数最好放在类中定义?
什么函数最好放在类外定义?
(2)分别给出如下的3个文件:
A)含类定义的头文件student.h。
//student.h
classStudent
{public:
voiddisplay();
private:
intnum;
charname[20];
charsex;
};
B)包含成员函数定义的源文件student.cpp
//student.cpp
#include
#include"student.h"
voidstudent:
:
display()
{cout<<"num:
"<cout<<"name:
"<cout<<"sex:
"<}
C)包含主函数的源文件main.cpp
//main.cpp
#include
#include”student.h”
intmain()
{Studentstud;
stud.display();
return0;
}
(1)请完善该程序,在类中增加一对数据成员赋值的成员函数set_value。
上机调试并运行。
(3)需要求3个长方柱的体积,请编一个基于对象的程序,数据成员包括length(长)、width(宽)、height(高)。
要求用成员函数实现以下功能:
A)由键盘分别输入3个长方柱的长、宽、高;
B)计算长方柱的体积;
C)输出长方柱的体积。
3.预习内容
《C++面向对象程序设计》第2章。
实验三类和对象
(二)
1.实验目的
(1)进一步加深对类和对象的理解。
(2)掌握类的构造函数和析构函数的概念和使用方法。
(3)掌握是对对象数组、对象的指针、及其使用方法。
(4)掌握友元的概念的使用。
(5)了解类模板的使用方法。
2.实验内容
(1)有以下程序:
#include
classStudent
{public:
Student(intn,floats):
num(n),score(s){}
voidchange(intn,floats){num=n;score=s;}
voiddisplay(){cout<private:
intnum;
floatscore;
};
voidmain()
{Studentstud(101,78.5);
stud.display()
stud.change(101,80.5);
stud.display();
}
A)阅读此程序,分析其执行过程,然后上机运行,对比输出结果。
B)修改上面的程序,增加一个fun函数,改写main函数。
在main函数中调用fun函数,在fun函数中调用change和display函数。
在fun函数中使用对象的引用(Student&)作为参数。
(2)商店销售某一商品,商店每天公布统一的折扣(discount)。
同时允许销售人员在销售是灵活掌握售价(price),在此基础上,对一次购买10件以上者,还可以享受9.8折优惠。
现已知当天3个销售员销售情况为
销售员号(num)销售件数(quantity)销售单价(price)
101523.5
1021224.56
10310021.5
请编程序,计算出当日此商品的总销售款sum以及每件商品的平均售价。
要求用静态数据成员和静态成员函数。
提示:
将折扣discount,总销售款宿命和商品销售总件数n声明为静态数据成员,
在定义静态成员函数average(求平均售价)和display(输出结果)。
(3)有以下程序:
#include
usingnamespacestd;
classDate;
classTime
{public:
Time(int,int,int);
voiddisplay(Date&);
private:
inthour;
intminute;
intsec;
};
classDate
{public:
Date(int,int,int);
friendvoidTime:
:
display(Date&);
private:
intmonth;
intday;
intyear;
};
Time:
:
Time(inth,intm,ints)
{hour=h;
minute=m;
sec=s;
}
voidTime:
:
display(Date&d)
{cout<cout<"<"<}
Date:
:
Date(intm,intd,inty)
{month=m;
day=d;
year=y;
}
intmain()
{Timet1(10,13,56);
Dated1(12,25,2004);
t1.display(d1);
return0;
}
分析和运行程序,注意友元函数Time:
:
display的作用。
将程序中的display函数不放在Time类中,而作为类外的普通函数,然后分别在Time和Date类中将display声明为友元函数。
在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年、月、日和时、分、秒。
修改后调试运行。
(4)有以下使用类模板程序
#include
usingnamespacestd;
templat
classCompare
{public:
Compare(numtypea,numtypeb)
{x=a;y=b;}
numtypemax()
{return(x>y)?
x:
y;}
numtypemin()
{return(x>y)?
x:
y;}
private:
numtypex,y;
};
intmain()
{Comparecmp1(3,7);
cout<cout<<Comparecmp2(45.78,93.6);
cout<cout<Comparecmp3('a','A');
cout<cout<return0;}
A)运行此程序,体会类模板的作用。
B)将它改写为在类模板外定义各成员函数。
3.预先内容
《C++面向对象程序设计》第3章。
实验四String类的定义和使用
1.实验目的
在具备C++字符串知识的基础上,将思维转换到面向对象上来,理解和使用String类;
掌握重载运算符函数;
开始理解和关注程序运行中和内存有关的问题;
2.相关知识介绍
2.1String类的介绍
2.2String类的定义
ClassString{
char*str;
intsize;
voidError(interrorType,intbadIndex=0)const;//出错报警函数
public:
String(char*s);
String(constString&s);//复制构造函数
~String(void);
//重载赋值运算符函数
String&operator=(constString&s);//String类的对象赋值
String&operator=(char*s);//字符串赋值给对象
//重载关系运算符函数
intoperator==(char*str,constString&s);
intoperator<(constString&s)const;//判断调用对象是否小于形参
intoperator<(char*str)const;
friendintoperator<(char*str,constString&s);
intoperator>(constString&s)const;
intoperator>(char*str)const;
friendintoperator>(char*str,constString&s);
//重载算术运算符函数
Stringoperator+(constString&s)const;
Stringoperator+(char*str)const;
friendintoperator+(char*str,constString&s);
//将对象转换成C++字符串
operatorchar*(void)const;
//重载输出运算符函数
friendostream&operator<<(ostream&ostr,constString&s);
intLength(void)const;
};//类定义完毕
3.实验内容
阅读String类的知识介绍,以及类的定义。
这个String类的定义涉及到许多面向对象的概念:
构造函数、析构函数、复制构造函数,
重载赋值、关系、算术运算符函数,
对于程序异常的处理:
数组下标越界和内存耗尽
所以对于课堂上学习的内容在实际中的应用,需要仔细琢磨,理解并能够应用。
将类的定义在VisualC++环境下编译,并编译通过。
上面给出的类定义,需要配合环境调试通过,比如包含头文件,修改编辑以及编译错误等。
将String类的定义中的构造函数、析构函数实现
1)实现构造函数String(char*s);
2)实现复制构造函数String(constString&s);
3)实现析构函数~String(void);
4.思考题
String类对象和字符串究竟有什么不同?
面向对象的String类究竟给字符串处理带来了什么优势?
实验五String类的定义和使用(续)
1.实验目的
在具备C++字符串知识的基础上,将思维转换到面向对象上来,理解和使用String类;
掌握重载运算符函数;
开始理解和关注程序运行中和内存有关的问题;
2.实验内容
2.1将String类的重载赋值运算符函数实现
1)实现String类的对象赋值String&operator=(constString&s);
2)实现字符串赋值给对象String&operator=(char*s);
2.2将String类的重载关系运算符函数实现
1)实现字符串相等判断函数:
intoperator==(char*str,constString&s);
2)实现调用对象所含的字符串是否小于形参s所含的字符串的判断:
intoperator<(constString&s)const;
3)实现调用对象所含的字符串是否小于形参字符串str的判断:
intoperator<(char*str)const;
4)实现调用形参字符串str是否小于形参s所含字符串的判断:
friendintoperator<(char*str,constString&s);
5)实现调用对象所含的字符串是否大于形参s所含的字符串的判断:
intoperator>(constString&s)const;
6)实现调用对象所含的字符串是否大于形参字符串str的判断:
intoperator>(char*str)const;
7)实现调用形参字符串str是否大于形参s所含字符串的判断:
friendintoperator>(char*str,constString&s);
2.3将String类的重载算术运算符函数实现
8)实现调用对象和形参对象所含的字符串相加
Stringoperator+(constString&s)const;
9)实现调用对象所含的字符串和形参的字符串str相加
Stringoperator+(char*str)const;
10)实现形参字符串str和形参s所含的字符串相加
friendintoperator+(char*str,constString&s);
2.4将String类的出错报警函数实现
11)实现出错报警函数:
voidError(interrorType,intbadIndex=0)const;
出错报警函数能够根据入参传递的错误类型,给出相应的错误告警。
2.5将String类的重载输出运算符函数实现
12)实现重载输出运算符函数
ostream&operator<<(ostream&ostr,constString&s);
完成把s所含的字符串输出到屏幕上。
2.6实现将字符串转换成String对象
13)实现将字符串转换成String对象
operatorchar*(void)const;
2.7实现返回对象所含字符串的长度
14)实现返回对象字符串的长度
intLength(void)const;
2.8检验字符串对象的连接、计算长度和输出
s1=string,s2=class
要求完成连接功能,能够计算字符串的长度,编译运行得到输出:
string和class连接成stringclass
Lengthof“stringclass”=12
2.9检验字符串对象的复制、赋值、输出
1)要求将上面的s1+s2连接得到的字符串赋值到s4当中;
2)再将s4的内容后面增加“inMFCis”;
3)将s4的内容后面连接上“Cstringclass”
4)将s4的内容输出到屏幕上;
按照要求完成程序,编译运行,得到输出:
stringclassinMFCisCstringclass
2.10检验字符串的比较大小
1)任意输入两个字符串
2)将输入的字符串转换成String对象
3)给出比较大小的结果
实验六继承与派生
1.实验目的
(1)了解继承在面向对象程序设计中的重要作用。
(2)进一步理解继承和派生的概念。
(3)掌握通过继承派生