博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

sislcb

寻找自己
sislcb.cublog.cn
高质量程序设计 --第八章 c++/c高级数据类型
结构(Struct)
struct和class的唯一区别:默认的成员访问权限不同。
struct默认是public,class默认是private。
 
struct SA
{
  public:
     const char * GetName() const;
  private:
     char *m_name;
};
class CA
{
  public:
     const char * GetName() const;
  private:
     char *m_name;
};
Lippman说:“在c++中,选择使用关键字struct还是class来定义UDT或ADT完全是一种观念的差异,而关键字本身并没有代表这种差异”
 
把c风格的struct叫POD(Plain Old Data),仅包含数据成员。
任何POD对象的初始化都可以用memset()函数或者其他类似的内存初始化函数,假如s是一个Student对象,那么:memset(&s,0x00,sizeof(Student));
结构可以嵌套定义。
 
一个对象无法自包含,无论是直接还是间接包含。因为编译器无法计算它的sizeof值。
对象不能自包含,但可以自引用,而且两个类型可以交叉引用。
struct A
{
  int count;
  B *pb;
}
struct B
{
  char ch;
  A *pa;
  B *pb;
}
利用对象的引用关系,可以实现链表,树,队列等。
 
位域
可以根据数据成员的有效取值范围来仔细规划它们各自所需的位数。
struct DataTime
{
  unsigned int year;
  unsigned int month    :4;
  unsigned int day      : 5;
  unsigned int hour     : 5;
  unsigned int minute   : 6;
  unsigned int second   : 6;
}
cout << sizeof(DateTime) <<endl; //8
c语言位域各成员必须是int、unsigned int、signed int等类型,而c++还允许char、long类型。不允许使用指针类型或浮点类型作为位域的成员类型。
不能定义超越类型最大值的位域成员,比如:
signed int year: 33; ///错误
规则:请使用sizeof运算符来计算位域的大小而不要自己估算。
 
成员对齐
#ifdef _MSC_VER
#pragma pack(push,8)  //按8字节边界对齐
#endif
struct Seden
{
  bool m_hasSkylight;
  Color m_color;
  bool m_isAutoShift;
  double m_price;
  BYTE m_seatNum;
}
#ifdef _MSC_VER
#pragma pack(pop)
#endif
 
规则:按照从大到小的顺序从前到后依次声明每一个数据成员,并且尽量使用较小的成员对齐方式。
 
如果不同模块恰好使用了不同的对齐方式,而模块间共享的复合数据类型没有显示的指定对齐方式,那么程序出错甚至崩溃的风险就会增加。
COM规范要求不得在接口中定义数据成员,其愿意之一就是这可能导致不同模块使用不同编译器而出现二进制不兼容。
 
联合(Union)
联合对象在同一时间只存储一个成员的值,如果你同时访问一个联合对象的多个成员,那么其中最多只有一个是正确的。
c++对c的union进行扩展,除了数据成员外还可以定义成员的访问说明符,可以定义成员函数,甚至可以定义构造函数和析构函数。但是联合不能包含虚拟成员函数和静态数据成员,不能作为其他类型的基类或者派生自其他类型。c++还支持匿名联合。
联合的另一个妙用就是用来解析一个寄存器或多字节内存变量的高低字节的值,而不需要我们手工使用位运算符来解析它们。
 
枚举(Enum)
在标准c中,枚举类型的内存大小等于sizeof(int)。但是在标准c++中,枚举类型的底层表示并非必须一个int--它可以更小或更大。
如果一个枚举变量的取值范围小到足以用一个short或byte来表示,那么这个枚举变量的底层表示就可能采用short或byte;相反,如果一个枚举变量的取值范围大到必须采用一个比int更大的类型来表示的话,那编译器允许使用更大的类型来表示枚举变量。
枚举类型可以是匿名的,匿名的枚举类型就相当于直接定义的const常量,可以作为全局枚举,也可以放在任何类定义或名字空间内。
enum
{
  OBJECT_CREATION     = 0x10;
  OBJECT_DELETION     = 0x11;
  ......
}
 
 

发表于: 2007-09-03,修改于: 2007-09-03 21:51,已浏览630次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:3.92296