第三章 实验内容与指导
3.1 实验一 类和对象 实验类型:设计型实验 4学时 3.1.1 实验目的
1、掌握类的概念以及定义类的方法;
2、掌握类的构造函数和析构函数的概念和使用方法;3、掌握对象数组、对象指针的定义和使用方法; 4、学习友元的概念和定义使用方法; 5、学习简单面向对象程序的编写;
3.1.2 知识点介绍
1、类的定义方法:
class 类名称 {
public:
公有成员(外部接口) private:
私有成员 protected:
保护型成员 };
2、访问对象中的成员可以有3种方法:
通过对象名和成员运算符访问对象中的成员; 通过指向对象的指针访问对象中的成员;
44
通过对象的引用变量访问对象中的成员;
3、构造函数(constructor)来处理对象的初始化。
构造函数是一种特殊的成员函数,不需要用户来调用它,而是在建立对象时自动执行。
构造函数的名字必须与类名同名,编译系统能识别它并把它作为构造函数处理。
它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。
如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
用户可以自定义带参数的构造函数 构造函数首部的一般格式为
构造函数名(类型 1 形参1,类型2 形参2,?) 实参是在定义对象时给出的。 4、构造函数的重载:
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。
这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。
尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。
5、析构函数(destructor)
是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。
当对象的生命期结束时,会自动执行析构函数:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
②static局部对象在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
45
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。
程序设计者事先设计好析构函数,以完成所需的功能,只要对象的生命期结束,程序就自动执行析构函数来完成这些工作。
析构函数不返回任何值,没有函数类型,也没有函数参数。因此它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数
析构函数的作用并不仅限于释放资源方面,它还可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”,
如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作都不进行。 6、对象数组:
不仅可以由简单变量组成(例如整型数组的每一个元素都是整型变量),也可以由对象组成(对象数组的每一个元素都是同类的对象)。
7、定义指向类对象的指针变量的一般形式为:
类名 *对象指针名; 8、this指针:
在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。
它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
this指针是隐式使用的,它是作为参数被传递给成员函数的。
46
9、友元可以访问与其有好友关系的类中的私有成员。 友元包括友元函数和友元类。
在类体中用friend对类以外函数进行声明,此函数就称为本类的友元函数。
友元函数可以访问这个类中的私有成员。 友元成员函数
friend函数不仅可以是一般函数(非成员函数),而且可以是另一个类中的成员函数。
一个函数(包括普通函数和成员函数)可以被多个类声明为“朋友”,这样就可以引用多个类中的私有数据
在A类的定义体中用以下语句声明B类为其友元类: friend B;
这时B类就是A类的友元类。友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。
关于友元,有两点需要说明:
(1) 友元的关系是单向的而不是双向的。 (2) 友元的关系不能传递。 3.1.3 实验内容 题目1 图形类设计
设计三个图形类:Circle(圆)、Rectangle(矩形)、Triangle(三角形);
1、Cirlce类基本信息:圆心坐标、半径;
Rectangle类基本信息:长、宽;
Triangle类基本信息:三个顶点坐标; 其中:成员变量为private属性,成员函数为public
属性;
2、每个图形类有多个构造函数:缺省构造函数、带参数的构造函数;
3、每个图形类有计算图形的面积GetArea(),显示图形的基本信息函数Show(),修改基本信息的函数Set(形参)。
47
以Circle类为例:通过GetArea()计算圆的面积,Show()函数中显示圆心坐标、直径、周长、面积等基本信息;Set(int x,int y, int r)函数可以修改圆心坐标和半径。
4、各个类的声明放在相应的头文件中(*.h),类的实现放在相应的实现文件中(*.cpp); [实验提示]
1、注意多个构造函数的声明方式与定义实现;
2、当输入数据为不合理数据时(例如:输入的三角形的顶点是否能组成一个三角形),提示用户输入错误; [测试数据]
1、Circle类测试数据: 圆心:(20,30) 半径:5 (-20,40) 30 (40,-10) -5 2、Rectangle类测试数据: 长和宽:20,50 40,5
3、Triangle类测试数据: 顶点:(20,30)、(40,50)、(40,20) (10,10)、(50,10)、(35,10) [思考与扩展]
题目2 人员管理
设计某小型公司的Employee(人员)类 1、类
48