C++快速入门 (十四) 结构和联合
2013-02-25 14:06
393 查看
一,结构 struct
(1). 结构与类的异同
在C++中除了 结构struct 默认的访问权限为 公有,而 类class 默认的访问权限为私有 外没有任何区别。但一般的 只用结构包含一些简单的数据类型。(2). 位域
位域就是将成员类型按位存储。如[align=left]struct DateTime[/align]
[align=left]{[/align]
[align=left] int a:12;[/align]
[align=left] int b:16;[/align]
[align=left] int c:10;[/align]
[align=left] char d:9; // error 不能大于其类型的位数 char最大为8位[/align]
[align=left]}date;[/align]
其中 变量 a 可以存取 十一位二进制所能表示的数(int为有符号类型,所以需要一位作符号标志位),超过则会溢出。而位域所能使用的成员类型只能一下几种且成员位数不能大于变量类型的位数。
int
unsigned int
signed int
char (C++特有)
long (C++特有)
需要注意的是
位域也会自动对齐到字长度(长度对齐),
位域的成员变量不能取地址操作,
使用位域虽然节省空间,但将会降低运行速度。(空间与时间选择)
尽量不要让一个变量跨越两个不完整的字节,可以使用填充 0, 来对齐字节
[align=left]struct DateTime[/align]
[align=left]{[/align]
[align=left] char a:5; [/align]
[align=left] char :0; // 该字节剩余的 3位将会用 0 填充[/align]
[align=left] int b:16;[/align]
[align=left] int c:10;[/align]
[align=left]}[/align]
(3). 另一种创建实例方法
C++经常见到另一种实例化类型或结构的简写方式(特别是结构),如[align=left] struct MyStruct[/align]
[align=left] {[/align]
[align=left] MyStruct():x(30) { cout << "构造器" << endl; }[/align]
[align=left] int x;[/align]
[align=left] } st;[/align]
[align=left] cout << st.x << endl;[/align]
二,联合 union
(1). 定义
C++中的联合可以在同一个内存空间内表示多种类型。但一次只能使用一种类型。联合以占用内存最大的类型为标准初始化。(2). 联合和类的异同
联合的默认成员为公有。联合也需要实例化才能使用。
可以有成员函数,但不能自定义构造和析构函数。
可以使用访问限定符。
成员变量可以是自定义类型,但该类型不能有自定义构造和析构函数。
不能有静态成员和引用成员。
联合不能为基类,不能有虚函数。
示例如下:
[align=left]int _tmain (int argc, _TCHAR* argv [])[/align]
[align=left]{[/align]
[align=left] union MyUnion[/align]
[align=left] {[/align]
[align=left] short x;[/align]
[align=left] char c;[/align]
[align=left] };[/align]
[align=left] MyUnion un = {0x62};[/align]
[align=left] cout << un.c << endl;[/align]
[align=left] un.c = 'a';[/align]
[align=left] cout << un.c << endl;[/align]
[align=left]}[/align]
[align=left]//return:[/align]
[align=left]// b[/align]
[align=left]// a[/align]
总结:
联合初始化赋值是为第一个成员赋值。并且必须带花括号。
由此示例也可以看出 x86机器确实使用小端法表示
(3). 匿名联合
匿名联合可以直接用成员名访问。但匿名联合不能有私有成员或函数。[align=left]int _tmain (int argc, _TCHAR* argv [])[/align]
[align=left]{[/align]
[align=left] union[/align]
[align=left] {[/align]
[align=left] short x;[/align]
[align=left] char c;[/align]
[align=left] };[/align]
[align=left] x = 0x62;[/align]
[align=left] cout << c << endl;[/align]
[align=left] c = 'a';[/align]
[align=left] cout << c << endl;[/align]
[align=left]}[/align]
-
<原创文章 转载请注明出处 http://blog.csdn.net/meiwm 谢谢>
作者:meiwm
出处:http://blog.csdn.net/meiwm
本文为原创,本文版权归作者所有。欢迎转载,但请务必保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
-
相关文章推荐
- 快速入门C++ 05(联合、枚举和类型别名)
- 联合、枚举和类型别名 - C++快速入门13
- 联合、枚举和类型别名 - C++快速入门13
- C++快速入门--10--多态
- C++快速入门--12--抽象类和接口模拟
- this指针和类的继承 - C++快速入门16
- 从C到C++——C++快速入门简明参考
- C++快速入门 (十三) 继承和多态
- C/C++快速入门—刷题中的一些语法注意事项
- [C++]数据结构:排序算法Part2----快速排序、归并排序、箱子排序、基数排序
- 给大家介绍对象 - C++快速入门14
- 容器和算法2 - C++快速入门48(完)
- 从一个小程序说起2 - C++快速入门03
- 从另一个小程序接着说 - C++快速入门04
- C++快速入门--2
- C++快速入门
- Python快速入门2--数据结构
- C++中的枚举,结构,联合等。。。。
- 快速入门C++ 11(虚继承、错误处理和调试)
- 多继承 - C++快速入门28