设为首页 加入收藏

TOP

第18章 特殊工具与技术(11)
2014-11-24 12:22:37 】 浏览:9787
Tags:特殊 工具 技术

上一篇:http://www.2cto.com/kf/201201/116372.html

18.5 联合:节省空间的类
联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但在任何时刻只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。
为union对象分配的存储的量至少与包含其最大数据成员的一样多。像任何类一样,一个union定义了一个新的类型。
1.定义联合
联合提供了便利的办法表示一组相互排斥的值,这些值可以是不同类型的。
一个union定义了以关键字union开始,后接(可选的)union名字,以及一组以花括号括住的成员声明。
class AndersClass{};

union UnionClass{
char *cval;
int ival;
double dval;
AndersClass anders;
};

static union{
char cval;
int *ival;
double dval;
AndersClass anders;
};
2. 没有静态数据成员、引用成员或类数据成员
某些(但不是全部)类特征同样适用于union。例如,像任何类一样,union可以指定保护标记使成员成为公用的、私有的或受保护的。默认情况下,union表现得像struct:除非另外指定,否则union的成员都为public成员。
union也可以定义成员函数,包括构造函数和析构函数。但是,union不能作为基类使用,所以成员函数不能为虚数。
union不能具有静态数据成员或引用成员,而且union不能具有定义了构造函数、析构函数或赋值操作符的类类型的成员。
3. 使用联合类型
union的名字是一个类型名。像其他内置类型一样,默认情况下union对象是未初始化的。可以用与显式初始化简单类对象一样的方法显式初始化union对象。但是,只能为第一个成员提供初始化式。该初始化式必须包括在一对花括号中。
UnionClass uc={new char('a')};
4. 使用联合的成员
可以使用普通成员访问操作符(.和->)访问union类型对象的成员。
UnionClass uc={new char('a')};
cout<<*uc.cval< 给union对象的某个数据成员一个值使得其他数据成员变为未定义的。使用union对象时,我们必须总是知道union对象中当前存储的是什么类型的值。通过错误的数据成员检索保存在union对象中的值,可能会导致程序崩溃或者其他不正确的程序行为。
避免通过错误成员访问union值的最佳方法是,定义一个单独的对象跟踪union中存储了什么值。这个附加对象称为union的判别式(discriminant)。
5. 嵌套联合
union最经常用作嵌套类型,其中判别式是外围类的一个成员。
class TheClass{
public:
enum ClassKind{INT,CHAR,DBL};
ClassKind ck;
union {
char cval;
int ival;
double dval;
} val;
};
TheClass tc=TheClass();
tc.val.cval=='1';
6. 匿名联合
不用于定义对象的未命名union称为匿名联合(anonymous union)。匿名union的成员的名字出现在外围作用域中。
class TheClass2
{
public:
union {
char cval;
int ival;
double dval;
};
};
TheClass2 tc2=TheClass2();
tc2.cval='1';
匿名union不能有私有成员或受保护成员,也不能定义成员函数。

摘自 xufei96的专栏

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇第18章 特殊工具与技术(12) 下一篇aio,epoll,libevent,boost::asio..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目