伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Symbian OS 中的Class命名约定( T类)

Posted on 2007-02-09 16:17  伯乐共勉  阅读(166)  评论(0编辑  收藏  举报
T类的功能非常类似于ANSI C++的内部数据类型,因此它们的前缀与上面所说的typedefs为同一个字母(“T”为“Type”)。和所有的内部数据类型一样,它们也没有析构函数,所以T类也不应包含任何有析构函数的成员数据。T类中可以包含的数据成员如下: 
     “‘plain ol’ data”(内部类型)及对其它T类对象。
     
    指针和引用(reference) “uses a”关系的效率要优于“has a”关系,后者暗示了拥有关系,TPtrC描述符是一个典型的指针T类,在第5章中有详细的论述。

    T类内部包含它们的所有数据但并不包含指针,引用或句柄 (尽管允许使用指向其他对象数据的引用)。T类不允许拥有外部数据的原因是因为T类禁止拥有析构函数。

     不用析构函数,T类对象可以在stack上创建并在离开函数作用域时恰当的清除,正常返回或者产生一个leave(“leaving”的详细论述参见第2 章)。即使T类有析构函数,Symbian OS也不能在发生leave时调用它,因为leave不同于ANSI C++中的throw机制。如果需要调 用析构函数来安全的清除对象,对象只能在代码作用域内的stack上创建,因为在这个作用域内不会产生leave——这无疑带来了一些限制。

    T类对象也可以在heap上创建。但在heap上创建的T类对象必须在有可能产生leave的代码之前将其压入清洁栈(cleanup stack)。一旦leave发生,T类对象的内存可以通过清洁栈来释放(详细论述参见第3章) 但是这样不会调用析构函数。
T类在一般情况下同样不定义默认构造函数,实际上,当一个T类仅由内部类型组成时,构造函数将会阻止你使用类似下面的成员初始化方式:

    TMyPODClass local = {2000, 2001, 2003};

     但是,T类在导出虚函数极少的情况下,默认的构造函数必须导出,因为它需要依靠一些客户端代码链接。针对这一问题我们将在第20章详细讨论EXPORT_C操作符。
    
      通常,T类成员非常单一,足以进行逐位复制(bitwise copy),所以复制构造函数和赋值操作符是很简单的,编译器自动产生的版本可以有更高的效 率。所以除非有特殊要求通常不需要编写复制构造函数和赋值操作符。当然如果需要防止复制操作,就需要在class中将复制构造函数和赋值操作符声明为 private并且不予实现。

       一些T类的API非常复杂,例如那些可以进行字符串分析的TLex类和描述符基类TDesC 与TDes(参见第5章)。但在有些情况下,T类只是一个C语言风格的由公共数据成员组成的struct(通常,struct的前缀是S而不是T,但近来 大多数Symbian OS的代码更倾向于使用T前缀)。
在枚举中你也可以看到T前缀的使用,因为它们同样是简单类型。例如:
enum TMonthsOfYear{EJanuary=1,EFebruary = 2,……,EDecember= 12};

基本原则----T类禁止拥有析构函数