我翻译的文档----Symbian基本规范:类类型

译自Developer Library » Symbian OS Guide » Essential idioms » Class types

 

概要

    Symbian OS上的应用程序使用4种常用的类,它们是:

l         T开头的值类,这种类不拥有任何外部对象,只是通过指针直接引用或通过句柄间接引用外部对象。

l         C开头的基于堆分配的类,这种类全部是从CBase派生过来的。

l         R开头的资源类,R类对象包含其它位置拥有资源的句柄。

l         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派生的类有下面的特性:

l         它们总是在堆上而不是栈上创建,并且不做为其它类的成员。

l         分配程序会把类层次中的成员数据初按二进制0初始化。

l         它们通过指针或引用传递,并且不需要拷贝构造函数和重载赋值运算符,除非确定某个类确实需要支持拷贝操作。

l         它们不用通常的构造方法,因为在通常的构造过程中可能会有leave发生,习惯上通过一个二阶段构造(two-phase construction)来实现,C++中的构造函数只负责那些不会产生leave的构造,然后在一个名为ConstructL()的函数中处理那些可能会产生leave的构造。

l         它们有一个虚析构函数,它被用来进行标准的清除过程。

l         因为有一个虚析构函数,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 类是其它地方对象的代理,这样做有两个主要的动机:

l         直正的对象是一个server拥有的,在不同的线程或地址空间。

l         真正的对象对client来说必须是隐藏的。

 

    下面是R类对象的关键特征:

l         它们含有一个用来传递请求到另一个对象的句柄。

l         R类通常用名为“open”的函数打开,用名为“close”的函数关闭。一个R类对象打开后必须被关闭。通常如果打开资源的线程关闭后与R类对象关联的资源被自动关闭。

l         它们可以直接按位拷贝。

l         它们没有构造函数,析构函数,拷贝构造函数或重载赋值运算符。

 

R类使用许多协议来处理这些需求:

l         R类间的句柄特征可能是不同的。

l         R类没有共用基类。

l         初始化函数可能有许多名字:可能是Open(), Create(), Allocate()等等。

l         终止函数可能有许多名字:可能是Close(), Destroy(), Free()等等。

l         因为R类拥有外部对象,在清除时就有一些要求:这些要求根据不同的类有不同的处理方法。

 

 

接口类型:M

    M类定义抽象协议或接口,具体的实现由派生类提供。

    M类有下面的限制:

l         它们不可以有数据成员。

l         它们不可以有构造函数、析构函数,或者重载的操作符,比如‘=’。

 

    M类常常包含定义完全抽象接口的纯虚函数。一些M类在上面的限制内实现一些或全部的成员函数。

    M类是Symbian OS中唯一使用多重继承的方法。更多细节请查看SDK文档(» Developer Library » Symbian OS Guide » Essential idioms » Multiple inheritance and interfaces)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值