C++快速入门 (十四) 结构和联合

来源:互联网 发布:英文名与中文名 知乎 编辑:程序博客网 时间:2024/05/01 12:00

一,结构 struct

(1). 结构与类的异同

在C++中除了 结构struct 默认的访问权限为 公有,而 类class 默认的访问权限为私有 外没有任何区别。但一般的 只用结构包含一些简单的数据类型。

(2). 位域

位域就是将成员类型按位存储。如

struct DateTime
{
    int   a:12;
    int   b:16;
    int   c:10;
    char d:9;  // error 不能大于其类型的位数 char最大为8位
}date;

其中 变量 a 可以存取 十一位二进制所能表示的数(int为有符号类型,所以需要一位作符号标志位),超过则会溢出。而位域所能使用的成员类型只能一下几种且成员位数不能大于变量类型的位数。
  • int
  • unsigned int
  • signed int
  • char (C++特有)
  • long (C++特有)

需要注意的是
  • 位域也会自动对齐到字长度(长度对齐),
  • 位域的成员变量不能取地址操作,
  • 使用位域虽然节省空间,但将会降低运行速度。(空间与时间选择)
  • 尽量不要让一个变量跨越两个不完整的字节,可以使用填充 0, 来对齐字节

struct DateTime
{
    char a:5;    
    char :0;   // 该字节剩余的 3位将会用 0 填充
    int   b:16;
    int   c:10;
}


(3). 另一种创建实例方法

C++经常见到另一种实例化类型或结构的简写方式(特别是结构),如

    struct MyStruct
    {
        MyStruct():x(30) {  cout << "构造器" << endl; }
        int x;
    } st;
    cout << st.x << endl;



二,联合 union

(1). 定义

C++中的联合可以在同一个内存空间内表示多种类型。但一次只能使用一种类型。联合以占用内存最大的类型为标准初始化。

(2). 联合和类的异同

  • 联合的默认成员为公有。
  • 联合也需要实例化才能使用。
  • 可以有成员函数,但不能自定义构造和析构函数。
  • 可以使用访问限定符。
  • 成员变量可以是自定义类型,但该类型不能有自定义构造和析构函数。
  • 不能有静态成员和引用成员。
  • 联合不能为基类,不能有虚函数。
示例如下:

int _tmain (int argc, _TCHAR* argv [])
{
    union MyUnion
    {
        short x;
        char c;
    };
    MyUnion un = {0x62};
    cout << un.c << endl;
    un.c = 'a';
    cout << un.c << endl;
}
//return:
// b
// a

总结:
  • 联合初始化赋值是为第一个成员赋值。并且必须带花括号。
由此示例也可以看出 x86机器确实使用小端法表示


(3). 匿名联合

匿名联合可以直接用成员名访问。但匿名联合不能有私有成员或函数。

int _tmain (int argc, _TCHAR* argv [])
{
    union
    {
        short x;
        char c;
    };
    x = 0x62;
    cout << c << endl;
    c = 'a';
    cout << c << endl;
}




-

<原创文章 转载请注明出处 http://blog.csdn.net/meiwm 谢谢>


作者:meiwm
出处:http://blog.csdn.net/meiwm
本文为原创,本文版权归作者所有。欢迎转载,但请务必保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。

-


原创粉丝点击