Symbian编程总结-基础篇-类类型

原文出自:http://discussion.forum.nokia.com/forum/showthread.php?t=68969

译自Developer Library » Symbian OS Guide » Essential idioms » Class types
概要
Symbian OS上的应用程序使用4种常用的类,它们是:
以T开头的值类,这种类不拥有任何外部对象,只是通过指针直接引用或通过句柄间接引用外部对象。
以C开头的基于堆分配的类,这种类全部是从CBase派生过来的。
以R开头的资源类,R类对象包含其它位置拥有资源的句柄。
以M开头的接口类,这种类定义了接口但需要派生类实现。
这些类与清除机制的需求相关,具体细节请参考SDK(Developer Library » Symbian OS Guide » C++ API guide » Base » Memory Management » Using Cleanup Support » Cleanup Stack Basics » Cleanup requirements)。
值类型:T类
最基本的类是值类型,它们的名字以T开头。
T类包含有它们的值,但这它们不拥有任何外部对象,只是通过指针直接引用或通过句柄间接引用外部对象。
T类可以在栈上分配(C++自动变量),也可以是其它类的成员。
T类的基本特征将在下面讲述。
构造函数:
许多T类非常简单以至于根本不需要构造函数,那些包含有构造函数的,是通过构造函数初始化成员数据。
拷贝构造函数和赋值运算符:
拷贝构造函数(TX(const TX&))和赋值操作符(TX& operator=(const TX&))很少需要,这是因为拷贝是浅拷贝,T类几乎都是按成员进行拷贝。C++编译器会产生缺省的拷贝构造函数和赋值操作符。
当T类是有一个整数参数的模板类时会需要这两个函数,这种情况下,拷贝或赋值TX<32>到TX<40> 比按位拷贝要复杂一些,因此需要明确实现拷贝构造函数和赋值操作符。
析构函数:
T类不需要析构函数,因为当T类生命周期结束后没有需要清除的外部资源。
消毁
T类可以安全的在栈上消毁,消毁意味着不用通过析构函数就可以释放内存。因为T类自己不拥有外部资源,所以当T类对象被消毁时不会有外部资源变的不可访问。
函数参数
做为函数参数时T类可以通过值和引用进行传递。
数据成员
T类可以包含其它T类对象,另外,可以包含R类对象或C类对象的指针,包含的这些对象是通过另一个类或函数进行清除的,在实践中,很少用这种方法。
标准类层次:C类和CBase类
使用最多的类除了T类还有C类,C类是直接或间接从CBase类派生出来的。
从CBase派生的类有下面的特性:
它们总是在堆上而不是栈上创建,并且不做为其它类的成员。
分配程序会把类层次中的成员数据初按二进制0初始化。
它们通过指针或引用传递,并且不需要拷贝构造函数和重载赋值运算符,除非确定某个类确实需要支持拷贝操作。
它们不用通常的构造方法,因为在通常的构造过程中可能会有leave发生,习惯上通过一个二阶段构造(two-phase construction)来实现,C++中的构造函数只负责那些不会产生leave的构造,然后在一个名为ConstructL()的函数中处理那些可能会产生leave的构造。
它们有一个虚析构函数,它被用来进行标准的清除过程。
因为有一个虚析构函数,C类对象可以很简单的使用清除(cleanup stack)进行清除;另外,因为C类对象是在堆(heap)上分配的,当有leave发生时,它们必需要被清除:这要求在处理所有C类对象时必须要有清除的意识。
C类的具体要求请查看SDK文档(Developer Library » Symbian OS Guide » C++ API guide » Base » Memory Management » Using Cleanup Support » Two Phase Construction)。
资源类型:R类
R 类是其它地方对象的代理,这样做有两个主要的动机:
直正的对象是一个server拥有的,在不同的线程或地址空间。
真正的对象对client来说必须是隐藏的。
下面是R类对象的关键特征:
它们含有一个用来传递请求到另一个对象的句柄。
R类通常用名为“open”的函数打开,用名为“close”的函数关闭。一个R类对象打开后必须被关闭。通常如果打开资源的线程关闭后与R类对象关联的资源被自动关闭。
它们可以直接按位拷贝。
它们没有构造函数,析构函数,拷贝构造函数或重载赋值运算符。
R类使用许多协议来处理这些需求:
R类间的句柄特征可能是不同的。
R类没有共用基类。
初始化函数可能有许多名字:可能是Open(), Create(), Allocate()等等。
终止函数可能有许多名字:可能是Close(), Destroy(), Free()等等。
因为R类拥有外部对象,在清除时就有一些要求:这些要求根据不同的类有不同的处理方法。
接口类型:M类
M类定义抽象协议或接口,具体的实现由派生类提供。
M类有下面的限制:
它们不可以有数据成员。
l 它们不可以有构造函数、析构函数,或者重载的操作符,比如‘=’。
M类常常包含定义完全抽象接口的纯虚函数。一些M类在上面的限制内实现一些或全部的成员函数。
M类是Symbian OS中唯一使用多重继承的方法。更多细节请查看SDK文档(» Developer Library » Symbian OS Guide » Essential idioms » Multiple inheritance and interfaces)。

你可能感兴趣的:(Symbian编程总结-基础篇-类类型)