第一章 类和对象
类和对象是面向对象程序设计的两个最基本、最重要的概念。所谓对象就是客观事务在计算机中的抽象描述;而所谓类则是对具有相似属性和行为的一组对象的统一描述。从程序设计语言的角度来说,类是一种数据类型,而对象是具有这种类型的变量。
1.类的定义
类定义的一般形式为:
class 类名
{
private:
数据成员或成员函数
protected:
数据成员或成员函数
public:
数据成员或成员函数
};
<各成员函数的实现代码>
其中,class是定义类的关键字。类名是一个有效的标志符,且一般首字母大写。大括号括起来的部分是类说明部分,它声明了类的所有成员(包括数据成员和函数成员),这些成员从访问权限上分成三类,即私有(private)、公有(public)和保护(protected),其中默认权限为private。
类的private部分说明的成员,在类之外是不能存取的,只有类中的成员函数才能存取private的数据成员和成员函数。类的public部分说明的成员,可被程序中的任何函数或语句存取,public成员多为成员函数,用来提供一个与外界的接口,外界只有通过这个接口才可以实现对private成员的存取。类的protected部分说明的成员,不能在类之外存取,只有类的成员函数及其子类(派生类)可以存取protected的成员。
2.成员函数的定义
类中的成员函数可以在两处定义:一是将成员函数的定义直接写在类中,一般适合于成员函数规模较小的情况;二是在类的定义体中只写出成员函数的原型说明,而成员函数的定义写在类的定义之外,这种情况比较适合于成员函数体较大的情况,其定义格式为:
返回值类型 类名::成员函数名(参数说明)
{
函数体;
}
此处的“::”符号称为作用域运算法(名空间分隔符),它是用来指明哪个函数属于哪个类或哪个数据属于哪个类。
需要说明的是,成员函数既可以是有参函数,也可以像普通函数一样,给形参指定默认值。
3.对象及指向对象的指针
对象是类的实例,定义对象之前一定要说明该对象的类。定义对象的一般格式为:
类名 对象名表;
其中,对象名表中可以有一个或多个对象名,多个对象名之间用逗号分隔。
另外,也可以定义指向类类型的指针,其定义格式为:
类名 *指针变量名;
4.访问对象的成员
访问对象的成员有以下两种格式:
(1) 对象名.成员名
(2) 指针变量名->成员名
第一种格式是利用对象和运算符“.”访问成员;而第二种格式是采用指向对象的指针和运算符“->”来访问成员,并且第二种格式中的指针变量必须已指向某个对象。
5.类成员指针
在C++语言中,除了可以定义指针对象外,还可以定义类成员指针。
类数据成员指针就是程序中定义的用于指向类中数据成员的指针变量,借助该指针变量可以访问它所指向的类中的数据成员(该数据成员必须具有public访问权限),但该指针变量不是类的成员,它只是程序中的一个指针变量而已。
类数据成员指针的定义格式如下:
类型 类名::*指针变量名;
此处的“类型”要与类中数据成员的类型保持一致。
要使已经定义的类数据成员的指针变量指向类中某个数据成员时,可以通过以下语句:
类数据成员指针变量名=&类名::类数据成员变量名;
当类数据成员指针变量已经指向类中某个数据成员时,可以通过以下语句访问类中数据成员:
对象名.*类数据成员指针变量名;
6.this指针
在每一个类成员函数的形参表中都有一个隐含的指针变量this,该指针变量的类型就是成员函数所属类的类型。当程序中调用成员函数时,this指针变量被自动初始化为发出函数调用的对象的地址。
尽管我们在定义成员函数时没有看到this指针变量,也没有定义this指针变量,但是在成员函数的函数体内我们可以使用this指针变量,因为该指针变量使系统隐含给出的,我们不需要也不能在成员函数的形参表中对this指针变量进行显示说明。
类中成员函数有了隐含的指针变量this后,就可以保证用不同的对象调用成员函数是对不同对象的操作。
7.对象赋值语句
对于同一个类生成的两个对象,可以进行赋值,其功能是将一个对象的数据成员赋值到另一个对象中去,赋值语句的左右两边各是一个对象名。
如,已知一个类Example,则:
Example obj1,obj2;
obj2=obj1;//将对象obj1的数据成员赋给对象obj2
8.对象的作用域和生存期
在不同的位置以不同的方式定义对象时,其作用域和生存期是不同的,其原理与普通变量相同。可分为局部对象(不包括局部静态对象)、静态对象(局部静态对象和全局静态对象)、全局对象等。
9.堆对象
所谓堆对象是指在程序运行过程中,根据需要随时可以建立和删除的对象。堆对象被创建在内存中一些空闲的存储单元中,这些存储单元被称为堆。堆可以被创建的对象占有,可以通过删除堆对象而获得释放。
需要利用new运算符创建堆对象,利用delete运算符删除堆对象。堆对象的生存期是整个程序的生命期。如:
Example *p;//p为指向类Example对象的一个指针
p=new Example(); //使用new给p分配内存空间
delete p; //使用delete释放p所指向的空间
10.对象数组
当一个数组的类型为类类型时,该数组中的每个元素都是该类中的一个对象,则这种数组就是对象数组。对象数组的定义格式为:
类名 数组名 [数组大小];
如:
Example array[10];
表明array数组是一个一维对象数组,该数组有10个元素,从array[0]到array[9],其中每个元素都是类Example的对象。