类
类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位。
类成员的访问权限
面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限。类成员有3种访问权限:
- 公有类型:由关键字public声明,在类外只能访问公有成员。
- 私有类型:由关键字private声明,私有成员只能被类本身的成员函数访问。
- 保护类型:由protect声明,与私有成员类似,区别仅在于继承过程中,保护类型的成员可以被所在类的派生类成员函数访问。
此处注意区分类的成员函数和类对象。
一般来说,公有成员是类的对外表现,而私有成员是类的内部实现,不希望外界了解。
成员函数的实现
类的数据成员说明了对象的特征,而类的成员函数决定对象的操作行为。成员函数是算法的实现部分,是对封装的数据进行操作的唯一途径。其实现方式可分为类内实现和类外实现。类外实现形式如下:
返回值类型 类名::成员函数名(形式参数表) { 函数体; }
类对象
对象是类的实例,系统不会为抽象的类分配存储空间,但却要为对象分配相应的内存空间。但这个内存空间只能用于存放对象的数据成员,其成员函数不在每个对象中的存储副本。
构造函数
对象的创建比普通变量的创建复杂,它需要在分配内存空间的同时将数据成员的初始值一并写入。构造函数的作用是在对象被创建时利用特定的值构造对象。
声明一个构造函数的语法格式如下:
public: 类名(<参数表>);
构造函数是类的一个特殊成员函数,它的函数名与类名相同,可以有任意类型的参数,但不能有返回类型。当创建一个新对象时,编译器会自动调用构造函数。构造函数可以自己编写提供;如果不提供,编译器会自动生成一个不带参数的默认构造函数(不做任何具体工作)。
重载构造函数:
所谓重载构造函数,是指同一个构造函数名,其参数表不同。注意:当构造函数带默认参数时,要避免出现歧义。
拷贝构造函数:
拷贝构造函数就是用来复制对象的一种特殊的构造函数。通过它,可以使用一个已经创建好的对象(由拷贝构造函数的参数指定)去初始化一个正在创建的同类对象。
声明拷贝构造函数的语法格式如下:
class 类名 { public: 类名(类名 & 对象名); };
拷贝构造函数只能有一个参数,而且是对某个同类对象的引用。每个类都必须有一个拷贝构造函数,如果该函数的功能仅仅是将已创建对象数据成员的值赋给正在创建对象的数据成员,那么没有必要显示定义它,而由编译器自动生成一个具有上述形式的默认拷贝狗仔函数。
析构函数
析构函数与构造函数的作用几乎相反,当一个对象消失时,或用delete删除用new创建的对象时,系统都会自动调用类的析构函数做一些清理工作。它调用完成后,对象就消失了,其相应的内存空间也就被释放了。
声明一个析构函数的语法格式如下:
class Demo { public: Demo(<参数表>); ~Demo(void); }
析构函数的函数名与类名相同,只是在前面加上一个"~"。它没有参数和返回值,但可以是虚函数。由于一个类只能定义一个析构函数,所以析构函数不能重载。析构函数调用顺序是最后创建的对象最先消亡。