return0;
}
intadd(inta,intb)
{
intc;
c=a+b;
returnc;
}
2)分别编写四个同名函数maxl,实现函数重载,在main()函数中测试函数功能。
程序名:
lab1_2.cpp。
3)编写矩阵转置函数,输人参数为3X3整型数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。
程序名:
lab1_3.cpp。
4)改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。
通过debug观察指针的内容及其所指的对象中的内容。
程序名:
lab1_4.cpp。
5)编写程序lab1_5.cpp,使用voidmain(intargc,char*argv[])函数中的参数传递操作的文件名,定义ofstream的对象对文件进行操作,使用read()和write()成员函数读入数据,使用输出流对象输出数据到文件和屏幕。
6)使用debug中的StepInto追踪到函数内部,观察函数的调用过程。
5.实验思考题
1)重载函数是通过什么来区分?
2)new和delete操作符与C语言中的malloc()和free()函数有何异同点?
3)C++提供的输入输出操作与C语言的输入输出操作的异同点?
4)什么是流?
使用流有那些好处?
5)C++与定义了那些流?
他们分别与什么设备相连?
实验2类和对象(4学时)
1.实验目的
1)学习类与对象的定义。
2)掌握类与对象的使用方法。
3)学习类和对象的声明。
4)学习具有不同属性的数据成员与成员函数的访问方式。
5)理解构造函数和析构函数的定义与执行过程。
6)学会类的聚集使用方法。
7)理解静态数据成员和静态成员函数的含义。
8)理解什么是运算符重载,掌握运算符重载的方法。
2.实验类型
设计型。
3.实验基本要求
1)下面是“平面上点”类的定义:
classCPoint
{
private:
intx,y;
staticintnCount;//nCount用于保存点的个数
public:
CPoint(intpx=0,intpy=0);
CPoint(CPoint&);
~CPoint();
intGetX();
intGetY();
voidSetX(int);
voidSetY(int);
voidShowPoint();
};
请完成该类中各成员函数的定义。
2)下面是“平面上线段”类的定义:
classCLine
{
private:
CPointpt1,pt2;//pt1和pt2分别代表该线段的起点和终点
public:
CLine();
CLine(intx1,inty1,intx2,inty2);
CLine(CPointp1,CPointp2);
doubleDistance();//计算该线段长度的成员函数
voidShowLine();
};
请完成该类中各成员函数的定义。
并利用VC调试工具观察含有组合关系类的构造函数和析构函数的执行情况。
3)以成员函数的方式,重载题目1中的CPoint类的“+”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之和;以全局函数的方式重载CPoint类的“-”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之差。
4)对于题目1中的CPoint类,重载“>>”运算符使得像cin等输入流对象能够写CPoint类对象,再重载“<<”运算符使得像cout等输出流对象能够输出CPoint类对象。
4.实验基本步骤
1)该类是一个基本的类。
在编写该类时,要注意对静态成员nCount的操作,使其能够正确表示程序中点的个数。
编完该类后,要在main()函数中进行测试,分别定义CPoint类的对象、指针、引用,对各成员函数进行调用。
分析对静态成员的调用和一般成员的调用方式有什么不同。
2)要思考如何对类中3个构造函数CLine(),CLine(intx1,inty1,intx2,inty2)和CLine(CPointp1,CPointp2);的编写,分析什么是初始化列表。
完成后要在main()中进行测试。
3)以成员函数方式重载的“+”操作符的原型为:
CPointCPoint:
:
operator+(CPointpt);以全局函数方式重载的“-”操作符的原型为:
CPointoperator-(CPointpt1,CPointpt2);分析以成员函数方式和全局函数方式重载运行符的异同点。
4)重载的“>>”操作符的原型为:
istream&operator>>(istream&,CPoint&);重载的“<<”操作符的原型为:
ostream&operator>>(ostream&,CPoint);思考一下,重载的“>>”操作符和“<<”操作符能否作为CPoint类的成员函数来实现。
5.实验思考题
1)类和结构体的区别是什么?
2)类的成员函数与普通的函数有何区别?
3)构造函数和析构函数的作用是什么?
4)类的访问控制权限有何意义?
5)什么是封装?
类是如何进行封装的?
6)类的静态成员函数和普通成员函数有什么不同?
7)根据自己的理解叙述运算符重载的作用?
实验3继承与多态(4学时)
1.实验目的
1)学习定义和使用类的继承关系,定义派生类。
2)熟悉不同继承方式下对基类成员的访问控制。
3)学习使用虚函数实现动态多态性。
4)学习利用虚基类解决二义性问题。
2.实验类型
设计型。
3.实验基本要求
1)使用实验2中的CPoint类,定义“空间中点”类如下:
classCThreePoint:
publicCPoint
{
private:
intz;
public:
CThreePoint();
CThreePoint(int,int,int);
intGetZ();
voidSetZ(intpz);
virtualvoidShowPoint();
};
请完成该类中各成员函数的定义。
并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。
分析为什么要把ShowPoint()函数设置为虚函数?
有什么作用?
请在main()函数中做测试。
2)下面是一个“Shape”基类的定义:
enumColorType{White,Black,Red,Green,Blue,Yellow,Magenta,Cyan};
//为图形形状定义Shape基类
class Shape
{
protected:
ColorType color;
public:
Shape(ColorTypec);
virtualvoiddraw();
};
使用Shape类和CPoint类设计一个可在屏幕上作图的简单实例,要求是不必真正在屏幕上实现作图,只是有一个示意即可。
例如:
画一个矩形,不必真正画出矩形,只需输出一句话:
“Thisisarectangle!
”即可。
要求可画线段、矩形和圆形。
要用到继承,虚函数,多态,数据的封装,构造函数的实现等等各种面向对象程序设计的特性。
3)定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函数的作用。
在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?
编程试试看。
4.实验基本步骤
1)编程时重点分析CThreePoint类的构造函数如何编写,并通过调试运行查看在继承关系中构造函数的执行顺序。
2)可以使用CPoint类,指明屏幕上特定点的位置,其他的各个类都可以使用它。
再使用基类Shape类,然后在Shpae类的基础上派生出各种类,如直线类Cline(可简单修改一下实验2中的Cline类),矩形类CRectangle,圆类CCircle。
注意要把每个类的特征用最简单的方式表示出来。
3)编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle),汽车(motorcar),从bicycle和motorcar派生出摩托车(motorcycle),它们都有Run、Stop等成员函数。
在main()函数中定义vehicle,bicycle,motorcar,motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。
再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。
5.实验思考题
1)C++中有哪几种派生方式?
每种方式的派生类对基类成员的继承和访问控制属性是什么样的?
2)派生类对象和基类对象是什么样的关系?
派生类对象的构造函数和析构函数的执行顺序是怎样的?
3)什么是多态?
在C++语言中,是如何实现多态的?
4)虚析构函数的作用是什么?
如何发挥作用?
5)引入虚基类后,基类和派生类的构造函数和析构函数的执行顺序要如何变化?
实验4模板与STL(4学时)
1.实验目的
1)理解什么是通用编程技术。
2)加强对模板相关概念的理解,熟悉模板编程的语法。
3)学习编写简单的函数模板和类模板。
4)理解STL中容器、算法、迭代器的等概念,明确它们之间的关系。
5)掌握STL中Vector容器的使用方法。
6)练习使用STL进行编程,加强是通用编程技术的理解。
2.实验类型
设计型
3.实验基本要求
1)编写一个函数模板,要求它返回两个值中的最小者。
但同时要确保正确处理字符串。
2)以下是一个整数栈类的定义:
constintSIZE=100;
classStack
{
public:
Stack();
~Stack();
voidPush(intn);
intPop();
private:
intstack[SIZE];
inttos;
};
编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据操作。
并在应用程序中创建整数栈、字符栈和浮点数栈,提供一些数据进行进栈、退栈和打印操作的测试。
3)编写一程序,让用户自由地从键盘上输入整数,直到输入数字0时结束。
把用户输入的数据保存在模板类Vector定义的对象中,并对用户输入的所有数进行排序输出。
在向显示器进行输出时,要求用一下3种方式实现:
a)仅使用Vector的相关成员函数,不使用迭代器进行输出;
b)使用迭代器自己编程输出;
c)使用STL提供的通用算法for_each进行输出。
4)以下是一个List类模板的定义:
templateclassList{
public:
List();//构造函数
voidAdd(T&);//在Link表头添加新结点
voidRemove(T&);//在Link中删除含有特定值的元素
T*Find(T&);//查找含有特定值的结点
voidPrintList();//打印输出整个链表
~List();
protected:
structNode{
Node*pNext;
T*pT;
};
Node*pFirst;//链首结点指针
};
完成对上述List类模板含有的各成员函数的定义。
然后定义一个简单的Student类,并利用编写的List类模板对一个班级的学生进行动态管理。
(根据自己的能力选做)。
4.实验基本步骤
1)函数模板的原型可定义为:
templateTmin(T&,T&),为了同时要确保正确处理字符串,而字符串不能用“<”来比较,所以还需要特别定义函数:
char*min(char*a,char*b)。
另外,要在main函数中对自己编写的模板进行测试。
2)根据整数栈的定义,可抽象出的栈类模板为:
template
classStack{
public:
Stack();
~Stack();
voidPush(T&n);
TPop();
private:
staticconstintSIZE;
T*stack;
inttos;
};
这里需要将该模板中的各成员函数进行定义即可。
tos是栈顶位置,Push()为压栈操作,Pop()为弹栈操作,要在这两个操作中分别考虑栈的长度和栈是否为空。
最后,要在main函数中对编写的栈类模板进行测试。
3)实现该题目时,首先定义模板类Vector的一个对象,利用该对象进行对用户输入数据的操作。
在进行数据输出时,第一种方式考虑采用类似于数组的随机访问方法,第二种方式利用Vector的迭代器进行输出,第二种方式则利用STL通用算法for_each进行实现,也可以才用copy函数进行实现。
4)要编写出这个程序,要理解Link类模板中各数据成员的含义。
pFirst代表链表首指针,Node代表链表的一个结点,pT为指向该结点对应数据的指针,理解这点非常重要。
5.实验思考题
1)谈谈使用模版进行编程的优点?
2)什么是函数模板和模板函数?
两者之间是什么关系?
3)什么是类模板和模板类?
两者之间有什么关系?
4)STL中容器、迭代器和算法三者之间的关系?
5)STL中为什么要提供通用算法?
它和类模板的成员函数相比,有什么特征?