类是面向对象程序设计的核心,是通过抽象数据类型方法实现的一种用户自定义数据类型,它同时包含了数据和对数据进行操作的函数。利用类可以实现数据的封装和隐藏。类是对某一类对象的抽象,而对象是某一种类的实例。
>类的定义
类的定义可以分为两部分:说明部分和实现部分。说明部分说明类中包含的数据成员和成员函数,实现部分是对成员函数的定义。
类定义的一般格式:
class <类名>
{
public:
<成员函数或数据成员的说明> //公有成员,外部接口
protected:
<数据成员或成员函数的说明> //保护成员
private:
<数据成员或成员函数的说明> //私有成员
};
//类的实现部分
<各个成员函数的实现>
其中,class是声明类的关键字;<类名>是声明的类的名字,必须符合标识符定义规则;花括号表示类的声明范围,其后的分号表示类声明的结束。类的成员包括数据成员和成员函数,分别描述类所表达的问题的属性和行为。关键字public、protected、private称为访问权限修饰符,它们限制了类成员的访问控制范围。
各个成员函数的实现既可以在类体内定义,也可以在类体外定义。如果一个成员函数在类体内进行了定义,它将不出现在类体的实现部分;如果所有的成员函数都在类体内进行了定义,则可以省略类的实现部分。在类体内定义的成员函数都是内联函数。
>类成员的访问控制
类中的成员具有不同的访问权限修饰符。类中提供了三种访问控制权限:公有(public)、私有(private)、保护(protected)。其中,公有类型定义了类的外部接口,任何来自类外部的访问都必须通过外部接口进行;私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的;保护类型介于公有类型和私有类型之间,在继承和派生时可以提现出其特点。
类中的访问权限修饰符可以以任意顺序出现,并且可以出现多次(建议具有相同访问权限的放在一起),但是一个成员只能具有一种访问权限。
类中成员默认的访问权限私有的(private)。
>类的数据成员
类中的数据成员描述类所表达的问题的属性。数据成员在类体中进行定义,其定义方式与一般变量相同,但对数据成员的访问要受到访问权限修饰符的控制。
#类中的数据成员可以是任意类型,包括整型、浮点型、字符型、数组、指针和引用等,可以是对象。但是要注意,只有其他类的对象,才可以作为该类的成员,即作为该类的成员对象而存在。自身类的对象是不可以作为自身类的成员存在的,但自身类的指针可以。
当另外一个类的对象作为该类的成员时,另外一个类却在该类的后面定义,即出现了两个类相互引用的情况,这时就需要进行前向引用声明。
示 例:
class B; //前向引用声明
class A{
public:
void f(B b);
};
class B{
public:
void f(A a);
};
#在类体中不允许对所定义的数据成员进行初始化。
示 例:
class date{
public:
void f(int x,int y,int z);
private:
int a(5),b(10),c(15) //Error!
};
>类的成员函数
类的成员函数描述类所表达的问题的行为。类中所有的成员函数都必须在类体内进行说明。但成员函数的定义既可以在类体内给出,也可以在类体外给出。
在类体内定义与定义一般函数一样,在类外部定义的成员函数的格式:
<返回类型><类名>::<成员函数名>(<参数表>)
{
<函数体>
}
在类体外定义成员函数时,要注意必须在成员函数名前加上类名和作用域运算符(::)。作用域运算符用来标识某个成员属于某个类。
作用域运算符的使用格式:
<类名>::<成员函数名>(<参数表>) 或 <类名>::<数据成员名>
成员函数的两种定义方式之间是有差别的。如果一个成员函数的声明和定义都在类体内,那么这个成员函数就是内联函数。如果一个成员函数的声明在类体内,而定义在类体外,这时对该成员函数的调用是按一般函数进行的。如果要将定义在类体外的成员函数也作为内联函数处理,就必须在成员函数的定义前加上关键字inline,以此显式地说明该成员函数也是一个内联函数。
成员函数还可以进行重载,可以对其形参设置默认值。
>对象的定义
对象是类的实例,一个对象必须属于一个已知的类,因此在定义对象之前,必须先定义该对象所属的类。
格式:
<类名><对象名>(<参数表>);
其中<类名>是待定义的对象所属的类的名字。<对象名>中可以有一个或多个对象名,多个对象名之间用逗号分隔。<参数表>是初始化对象时需要的,建立对象时可以根据给定的参数调用相应的构造函数对对象进行初始化。无参数时表示调用类的默认构造函数。还可以定义对象数组。指向对象的指针或引用。
>对象的成员
一个对象的成员就是该对象的类所定义的成员,包括数据成员和成员函数。定义了对象后,可以使用“ . ”运算符和 “ -> ”运算符访问对象的成员。其中“ . ”运算符适用于一般对象和引用对象,而“ -> ”运算符适用于指针对象(即指向对象的指针)。访问对象成员的格式:
<对象名>.<数据成员名> 或 <对象名> -> <数据成员名>
<对象名>.<成员函数名>(<参数表>) 或 <对象名> -> <成员函数名>(<参数表>)
注:<对象名> -> <数据成员名> 等价于(*<对象名>).<数据成员名>