T类和C类
C类由CBase派生而来,并且在堆上分配。因此,当不再需要它们的时候,一定要进行清理。大部分的C类都有析构函数。
C类通常由一个指针引用,这个指针保存于拥有该类对象的某个类的一个成员变量中,也可能是使用它的类的一个成员变量,或者是一个自动变量。
对于任何C类,CBase仅有两个作用:
- 零初始化,将所有的成员指针和句柄都初始化为0,保证清理安全。
- 一个虚析构函数,可以从清理栈中正确地销毁从CBase派生的对象。
T类型的例子:
- 任何内置类型(使用typedef定义)
- 任何枚举类型
- 不需要析构函数的类的类型
T类不拥有任何数据,因此它们不需要析构函数。不过,它们可以有指针,只要它们“使用”指针(对应“use-a”关系),而不是拥有指针(对应“has-a”关系)。
T类型通常作为自动变量分配,或者作为其他类的成员变量。
T类对象通常都是用逐元复制的方式来赋值。
因为C类型驻留在堆上,并且由指针引用,所以C类型是按引用传递的,也就是通过复制指针来传递。因而,C类型不需要拷贝构造函数或者赋值运算符。
R类
R对象本身一般不大。R类中的函数通常不改变R类本身的成员数据;相反,它给真正的资源所有者发送一条消息,标识使用句柄的真正对象,执行函数,并且发回一个结果。一般情况下,Close()函数释放资源,并把句柄值设置为0。
R类的一些特征:
- 可以是自动变量或者类成员,也可以复制它们,而且这个复制可以像原件一样使用。
- R类很少用指针来引用。它们通常按值或者按引用来传递。
- R类拥有资源:即R类含有指向资源的指针,并且负责为资源分配和释放内存。虽然R类通常没有析构函数,但是它们却有一个Close()函数,其效果与析构函数类似。调用Close()函数两次是安全的。
- R类零初始化它们的句柄值,使得直到初始化句柄后,才能使用这些函数。但是零初始化一定要在C++构造函数中显式进行。
对于使用R类对象的操作,一般的规则是:
- 首先创建一个R类对象,R类对象可以创建在栈上,也可以创建在堆上,分别对应T类、C类对象的使用
- 其次是调用R类的连接函数,在R类对象和管理资源的服务器建立连接
- 然后就可以调用R类访问资源的函数,向服务器发送操作请求了
- 最后,当使用完资源后,一定要断开和服务器之间的连接
M类
M类用于以一种可重用的方式给行为(而不是数据)打包。
使用M类作派生是Symbian OS中唯一允许的多重继承的类型。