return0;
}
intadd(inta,intb)
{
intc;
c=a+b;
returnc;
}
1.2.分别编写四个同名函数maxl,实现函数重载,在main()函数中测试函数功能。
程序名:
lab1_2.cpp。
1.3.编写矩阵转置函数,输人参数为3X3整型数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。
程序名:
lab1_3.cpp。
1.4.改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。
通过debug观察指针的内容及其所指的对象中的内容。
程序名:
lab1_4.cpp。
1.5.编写程序lab1_5.cpp,使用voidmain(intargc,char*argv[])函数中的参数传递操作的文件名,定义ofstream的对象对文件进行操作,使用read()和write()成员函数读入数据,使用输出流对象输出数据到文件和屏幕。
1.6.使用debug中的StepInto追踪到函数内部,观察函数的调用过程。
5.实验思考题
1.1.重载函数是通过什么来区分?
通过函数的参数个数或者参数类型的不同,也可以两者都不同。
1.2.C++提供的输入输出操作与C语言的输入输出操作的异同点?
同:
传递读和写的对象时采用的语法形式相同
异:
C语言的输入输出,通常以终端为研究对象;而C++语言的的输入输出,通常以程序为研究对象。
1.3.C++都定义了那些流?
他们分别与什么设备相连?
标准输入输出流---cincout---控制台
文件流---ifstream---ofstream文件
字符串流---Istrstream---ostrstream字符串
实验2类和对象(4学时)
1.实验目的
2.1.学习类与对象的定义。
2.2.掌握类与对象的使用方法。
2.3.学习类和对象的声明。
2.4.学习具有不同属性的数据成员与成员函数的访问方式。
2.5.理解构造函数和析构函数的定义与执行过程。
2.6.学会类的聚集使用方法。
2.7.理解静态数据成员和静态成员函数的含义。
2.8.理解什么是运算符重载,掌握运算符重载的方法。
2.实验类型
设计型。
3.实验基本要求
2.1.下面是“平面上点”类的定义:
classCPoint
{
private:
intx,y;
staticintnCount;//nCount用于保存点的个数
public:
CPoint(intpx=0,intpy=0);
CPoint(CPoint&);
~CPoint();
intGetX();
intGetY();
voidSetX(int);
voidSetY(int);
voidShowPoint();
};
请完成该类中各成员函数的定义。
2.2.下面是“平面上线段”类的定义:
classCLine
{
private:
CPointpt1,pt2;//pt1和pt2分别代表该线段的起点和终点
public:
CLine();
CLine(intx1,inty1,intx2,inty2);
CLine(CPointp1,CPointp2);
doubleDistance();//计算该线段长度的成员函数
voidShowLine();
};
请完成该类中各成员函数的定义。
并利用VC调试工具观察含有组合关系类的构造函数和析构函数的执行情况。
2.3.以成员函数的方式,重载题目1中的CPoint类的“+”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之和;以全局函数的方式重载CPoint类的“-”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之差。
2.4.对于题目1中的CPoint类,重载“>>”运算符使得像cin等输入流对象能够写CPoint类对象,再重载“<<”运算符使得像cout等输出流对象能够输出CPoint类对象。
4.实验基本步骤
2.1.该类是一个基本的类。
在编写该类时,要注意对静态成员nCount的操作,使其能够正确表示程序中点的个数。
编完该类后,要在main()函数中进行测试,分别定义CPoint类的对象、指针、引用,对各成员函数进行调用。
分析对静态成员的调用和一般成员的调用方式有什么不同。
2.2.要思考如何对类中3个构造函数CLine(),CLine(intx1,inty1,intx2,inty2)和CLine(CPointp1,CPointp2);的编写,分析什么是初始化列表。
完成后要在main()中进行测试。
2.3.以成员函数方式重载的“+”操作符的原型为:
CPointCPoint:
:
operator+(CPointpt);以全局函数方式重载的“-”操作符的原型为:
CPointoperator-(CPointpt1,CPointpt2);分析以成员函数方式和全局函数方式重载运行符的异同点。
2.4.重载的“>>”操作符的原型为:
istream&operator>>(istream&,CPoint&);重载的“<<”操作符的原型为:
ostream&operator>>(ostream&,CPoint);思考一下,重载的“>>”操作符和“<<”操作符能否作为CPoint类的成员函数来实现。
5.实验思考题
2.1.类和结构体的区别是什么?
结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。
类中的非static成员函数有this指针,类的关键字class能作为template模板的关键字即templateclassA{};,而struct不可以。
2.2.类的成员函数与普通的函数有何区别?
普通函数一般有两种传递方式,按类型传递和按值传递,也就是传指针和传返回值两种情况。
成员函数一般是按类型传递,也即是传指针地址。
普通函数可以随便调用,并且无法继承和封装,成员函数根据类的不同,可以进行继承,根据公有私有的不同,调用方式也不同。
2.3.构造函数和析构函数的作用是什么?
构造函数只是起初始化值的作用,但实例化一个对象的时候,可以通过实例去传递参数,从主函数传递到其他的函数里面。
析构函数与构造函数的作用相反,用于撤销对象的一些特殊任务处理,可以是释放对象分配的内存空间。
2.4.类的访问控制权限有何意义?
让使用者无法碰触到他们不该碰触的东西。
这些东西仅供类的内部机制使用。
将某些成员声明成private,对于使用者来说降低了对使用对象认识的难度。
让程序设计者可以更动class内部运作方式,而无须担心波及到客户端程序。
实验3继承与多态(4学时)
1.实验目的
3.1.学习定义和使用类的继承关系,定义派生类。
3.2.熟悉不同继承方式下对基类成员的访问控制。
3.3.学习使用虚函数实现动态多态性。
3.4.学习利用虚基类解决二义性问题。
2.实验类型
设计型。
3.实验基本要求
3.1.使用实验2中的CPoint类,定义“空间中点”类如下:
classCThreePoint:
publicCPoint
{
private:
intz;
public:
CThreePoint();
CThreePoint(int,int,int);
intGetZ();
voidSetZ(intpz);
virtualvoidShowPoint();
};
请完成该类中各成员函数的定义。
并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。
分析为什么要把ShowPoint()函数设置为虚函数?
有什么作用?
请在main()函数中做测试。
3.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.3.定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函数的作用。
在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?
编程试试看。
4.实验基本步骤
3.1.编程时重点分析CThreePoint类的构造函数如何编写,并通过调试运行查看在继承关系中构造函数的执行顺序。
3.2.可以使用CPoint类,指明屏幕上特定点的位置,其他的各个类都可以使用它。
再使用基类Shape类,然后在Shpae类的基础上派生出各种类,如直线类Cline(可简单修改一下实验2中的Cline类),矩形类CRectangle,圆类CCircle。
注意要把每个类的特征用最简单的方式表示出来。
3.3.编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle),汽车(motorcar),从bicycle和motorcar派生出摩托车(motorcycle),它们都有Run、Stop等成员函数。
在main()函数中定义vehicle,bicycle,motorcar,motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。
再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。
5.实验思考题
3.1.C++中有哪几种派生方式?
每种方式的派生类对基类成员的继承和访问控制属性是什么样的?
三种派生方式:
public,private,protected派生
public派生,在派生类里和外面都可以直接调用基类的公有部分。
protected保护派生,在派生类里可以直接调用,但是在派生外面不可以调用。
private私有派生,在派生类里和外面都不可以直接调用,但可以用函数间接调用。
3.2.派生类对象和基类对象是什么样的关系?
派生类对象的构造函数和析构函数的执行顺序是怎样的?
只有派生类继承于基类。
当用派生类定义一个对象时,除了继承时附加的函数和参数外,就是基类对象的函数和参数。
先执行派生类构造函数,再执行基类构造函数,析构函数执行正好相反。
3.3.什么是多态?
在C++语言中,是如何实现多态的?
在面向对象语言中,接口的多种不同的实现方式即为多态。
在C++语言中可以通过强制多态、重载多态、类型参数化多态、包含多态4种形式来实现。
实验4模板与STL(4学时)
1.实验目的
4.1.理解什么是通用编程技术。
4.2.加强对模板相关概念的理解,熟悉模板编程的语法。
4.3.学习编写简单的函数模板和类模板。
4.4.理解STL中容器、算法、迭代器的等概念,明确它们之间的关系。
4.5.掌握STL中Vector容器的使用方法。
4.6.练习使用STL进行编程,加强是通用编程技术的理解。
2.实验类型
设计型
3.实验基本要求
4.1.编写一个函数模板,要求它返回两个值中的最小者。
但同时要确保正确处理字符串。
4.2.以下是一个整数栈类的定义:
constintSIZE=100;
classStack
{
public:
Stack();
~Stack();
voidPush(intn);
intPop();
private:
intstack[SIZE];
inttos;
};
编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据操作。
并在应用程序中创建整数栈、字符栈和浮点数栈,提供一些数据进行进栈、退栈和打印操作的测试。
4.3.编写一程序,让用户自由地从键盘上输入整数,直到输入数字0时结束。
把用户输入的数据保存在模板类Vector定义的对象中,并对用户输入的所有数进行排序输出。
在向显示器进行输出时,要求用一下3种方式实现:
a)仅使用Vector的相关成员函数,不使用迭代器进行输出;
b)使用迭代器自己编程输出;
c)使用STL提供的通用算法for_each进行输出。
4.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.实验基本步骤
4.1.函数模板的原型可定义为:
templateTmin(T&,T&),为了同时要确保正确处理字符串,而字符串不能用“<”来比较,所以还需要特别定义函数:
char*min(char*a,char*b)。
另外,要在main函数中对自己编写的模板进行测试。
4.2.根据整数栈的定义,可抽象出的栈类模板为:
template
classStack{
public:
Stack();
~Stack();
voidPush(T&n);
TPop();
private:
staticconstintSIZE;
T*stack;
inttos;
};
这里需要将该模板中的各成员函数进行定义即可。
tos是栈顶位置,Push()为压栈操作,Pop()为弹栈操作,要在这两个操作中分别考虑栈的长度和栈是否为空。
最后,要在main函数中对编写的栈类模板进行测试。
4.3.实现该题目时,首先定义模板类Vector的一个对象,利用该对象进行对用户输入数据的操作。
在进行数据输出时,第一种方式考虑采用类似于数组的随机访问方法,第二种方式利用Vector的迭代器进行输出,第二种方式则利用STL通用算法for_each进行实现,也可以才用copy函数进行实现。
4.4.要编写出这个程序,要理解Link类模板中各数据成员的含义。
pFirst代表链表首指针,Node代表链表的一个结点,pT为指向该结点对应数据的指针,理解这点非常重要。
5.实验思考题
4.1.谈谈使用模版进行编程的优点?
1)编写一个模板,就可以在实例化的时候由一个模板解决不同类型数据所产生的相同问题;
2)实现了代码的重用,节约了程序员时间和精力。
4.2.谈谈函数模板和模板函数两者之间的关系,以及类模板和模板类两者之间的关系?
函数模板,实际上是建立一个通用函数,奇函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为模板函数。
模板类就是将类的数据类型用某个虚拟的类型来代替,用的时候,在传给具体的类型。
4.3.STL中容器、迭代器和算法三者之间的关系?
迭代器如同算法和容器之间的桥梁,算法通过迭代器从容器中获取元素,然后将获取的元素传递给特定的仿函数进行操作,最后将处理后的结果储存到容器中。