面向对象编程强调的是程序如何表示数据。面向对象编程解决编程问题的第一步就是根据它与程序之间的接口来描述数据,从而指定如何使用数据。然后,设计一个类来实现该接口。一般来说,私有数据成员存储信息,公有成员函数提供访问数据的唯一途径。当公有成员函数的代码过长,可以将其分为多个私有成员函数。类将数据和方法组成一个单元,其稀有性实现数据隐藏。
通常将类的声明分为两部分,这两部分通常保存在不同的文件中(多文件编程)。类声明放在头文件中,定义成员函数的源代码放在方法文件中。这样便将接口描述与实现细节分开了。从理论上说,只需要知道公有接口就可以使用类。当然,可以查看实现方法,但程序不能依赖于其实现细节。只要程序和类只通过定义接口的方法进行通信,程序员就可以随意地对任何部分做独立的改进,而不必担心这样做会导致意外的不良影响。
类是用户定义的类型,而对象是类的实例(变量)。C++ 试图让用户自定义的类型尽可能与内置类型类似,因此可以声明对象、指向对象的指针、对象数组;可以用对象为对象赋值;可以按值、按引用、按地址传递对象,将对象作为函数返回值。在创建对象时可以根据构造函数初始化对象。
对象将存储自己的数据成员,共享类方法。对象可以使用成员运算符(.)调用成员,对象指针则是使用 -> 运算符调用成员。
构造函数是特殊的成员函数,没有返回值,函数名与类名相同,可以被重载。由于构造函数是用于初始化对象的,在构造函数被调用之前对象还不存在,因此不会出现对象.构造函数()
的用法。
默认构造函数:如果程序员不曾定义构造函数,编译器会自动生成一个默认构造函数,没有任何参数,用于初始化对象。
复制构造函数:接受一个本类的引用作为参数,当使用一个本类对象来初始化另一个本类对象时被调用。如果程序员不曾定义复制构造函数,则编译器会自动生成一个默认复制构造函数,该构造函数的功能是拷贝数据成员,但需要注意这里的拷贝是浅拷贝,因此,如果数据成员是在构造函数中用 new 分配的内存,默认复制构造函数会出现一些问题,将在 Unit 4 中详细介绍。
转换构造函数:接受一个非本类类型的参数,可以是内置类型的变量,也可以是其他类的对象。需要和转换函数作区分,在 Unit 3 中详细介绍。
析构函数也没有返回值,函数名是 ~ClassName(),不接受任何参数。因此,一个类只有一个析构函数,不能被重载。析构函数在销毁对象时被调用,当构造函数中使用 new 来为成员分配内存时,析构函数中必须使用对应的 delete 来释放内存,将在 Unit 4 中详细介绍。
没有返回值的函数除了构造函数、析构函数之外,还有转换函数(Unit 3 中介绍)。
在类中声明常量可以用 static const,也可以用枚举,类中声明的枚举具有类作用域,不同类中可以存在相同名称的枚举量。还介绍了 C++ 新引入的一种枚举 —— 类作用域枚举class enum
。