实验5类和对象应用讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 类和对象的应用
一、实验目的
1.掌握类定义的基本格式和类成员的访问控制。
2.掌握对象定义和利用构造函数对对象的数据成员进行初始化的方法。
3.掌握成员函数的定义与使用。
4.理解并掌握静态数据成员和静态成员函数的使用方法。
5.理解友元函数的使用方法。
二、知识要点
1. 类的定义
在面向对象程序设计中,类(class)就是对现实世界中抽象出的“类”的模拟描述,是用户自己定义的数据类型,它的一般定义格式如下:
class <类名>
{
private:
<私有数据成员和成员函数>;
protected:
<保护数据成员和成员函数>;
public:
<公有数据成员和成员函数>;
};
<类中各个成员函数的实现>
说明:protected访问控制符主要用在类的继承中,后续课继承中会讲到
2. 类成员的访问控制
类的成员访问权限总体上可分为:公有的(public)、私有的(private)和保护的(protected)三类。若某个成员未作任何访问权限声明,则默认为私有的。
公有的成员用public来说明,这部分通常是一些操作(即成员函数),作为类与外界的接口,所有公有的成员可以在程序中的任何位置被访问。
私有的成员用private来说明,这部分通常是一些数据成员,这些成员用来描叙该类中对象的属性的,只有成员函数或经过特殊说明的函数(如友元函数)才可以引用它们,它们是特意被用户隐藏起来的部分,用户在类外其他地方是无法访问它们的。
保护的成员用protected来说明,它的限定能力介于私有和公有之间,除了类本身的成员函数、友元函数可以访问成员外,只有该类的派生类(子类)可以访问。
关键字public、private和protected被统称为访问权限修饰符或访问控制修饰符。它们在类体(即一对花括号内)出现的先后顺序没有要求,并且允许多次出现。
3. 对象的定义
C++规定:必须先定义类,然后定义对象,用类来定义对象在格式上与普通类型定义变
量是完全相同的.
定义对象的一般形式:
<类名> <对象名表>;
4.对象成员的访问方式
对象成员访问的一般形式是:
<对象名>.<数据成员名>
或者
<对象名>.<成员函数名>([<实参表>])
5.构造函数的定义和分类
构造函数是类的一种特殊的成员函数,它的主要作用于是为对象分配空间和进行初始化工作。除了具有一般成员函数的特征外,还具有以下一些特殊的性质:
(1)构造函数的名字必须与类名字相同;
(2)构造函数可以有任意类型和任意个数的参数,所以构造函数可以重载,但不能指定返回值类型;
(3)构造函数的函数体可以写在类体内,也可以写在类体外;
(4) 构造函数被声明为公有函数,但它不能像其他成员函数那样被显示的调用,而是在用类声明对象的同时被系统自动调用。
调用构造函数的一般形式是:
类名对象名(参数表);
构造函数分为4类,分别是普通构造函数、默认构造函数、有缺省参数的构造函数和复制(拷贝)构造函数。
6.默认构造函数
默认构造函数是指没有任何参数的构造函数。如果在设计类时没有定义构造函数,C++编译程序会自动为该类建立一个默认的构造函数。这个默认构造函数没有任何形式参数,并且函数体为空。其格式如下:
<类名>::<默认构造函数名>() { }
按构造函数规定,默认构造函数名与类名相同。默认构造函数也可以由程序员直接定义在类体中。另外,如果构造函数的参数具有默认值时,这样的构造函数被称为有缺省参数的构造函数。
7.拷贝构造函数
拷贝构造函数是一种特殊的构造函数,用于依据已存在的对象建立一个新对象。其一般形式为:
class T
{
public:
T(const T & 对象名);
……
}
T::T(const T &对象名 )
{ 函数体 }
其中,T代表任何一个类的名字。const是一个类型修饰符,被它修饰的对象是不能被改变的常量.
拷贝构造函数的拷贝分为浅拷贝和深拷贝。一般来说,只需浅拷贝时最好利用系统自动生成的拷贝函数,这样效率高。若需要在构造函数中开辟新的内存空间,则需要我们自己编
写这样的构造函数以完成深拷贝。
拷贝构造函数主要在下面3种情况中起到初始化作用。
(1) 声明语句中用一个对象初始化另外一个对象,例如:
Person student2 (student1);
(2) 函数的参数是值参数时,若用对象作为函数实参传递给函数形参,这时需要调用拷贝构造函数。
(3) 当对象作为函数返回值时,如执行return R 时,系统将用对象R来初始化一个匿名对象,这时需要调用拷贝构造函数。
8.析构函数
析构函数是类的一种特殊成员函数,其功能是用来释放一个对象的内存空间。它的功能与构造函数正好相反.
析构函数的特点如下:
(1)析构函数是成员函数,函数体可以写在类体内,也可以写在类体外;
(2)析构函数是一个特殊的函数,它的名字是在类名的前面加“~”字符;
(3)析构函数没有参数,没有返回值,所以不能重载。
在下面两种情况下,析构函数会被自动调用:
A.当一个对象的作用域结束时,该对象的析构函数被自动调用。
B.当一个对象是使用new运算符被动态创建的,那么在使用delete运算符释放它时,delete将会自动调用析构函数。
9.重载成员函数
构造函数可以重载,而析构函数不能重载,原因是构造函数可以有参数,析构函数不带任何参数,所以无法重载。可以说,带有不同类型和数量参数的成员函数都可以进行重载。
10.子对象
将一个类的对象作为另一个类的成员,该对象就被称为子对象。
在一个类中出现了子对象时,该类的构造函数就要考虑子对象的初始化问题。在C++中,通常采用初始化列表的方法来初始化子对象。在初始化列表中可以包括对子对象的初始化及对类中其他成员的初始化。
11.指向对象的指针
每个对象在声明后都会在内存中占有一定的空间,就会有地址。因此,可以用指针变量来保存这个地址。指向对象的指针(变量)就是用于存放对象地址的变量。声明对象指针的一般形式为:
<类名>*<对象指针名>;
声明对象指针的语法和声明其他数据类型指针的语法相同。使用对象指针时,首先要把它指向一个已创建的对象,然后才能以“间接方式”访问该对象。
12.this指针
this指针是一个隐含于每个类的成员函数中的特殊指针。该指针是一个指向正在操作的成员函数的对象。当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数。
13.对象数组
对象数组是指将对象作为数组元素的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义、赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是具有相同类的若干个对象。
定义一个对象数组的一般形式是:
<类名><数组名>[<数组长度>];