版权归原作者所有,如有侵权,请联系我们

[科普中国]-复合类型

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

在计算机科学中,复合类型是一种数据类型,它可以原始类型和其它的复合类型所构成。构成一个复合类型的动作,又称作组合。

C/C++主条目:C++类

struct是C和C++的复合类型概念,是一个将字段成员以一定组合方式所组成的数据类型1。因为在宣告时,使用了关键字struct,所以它简称为结构,或者更精确地说用户定义的数据结构。

在 C++ 里,struct与class的唯一区别是默认的访问档次,class是私有的,struct则是公有的。

注意尽管类的概念和关键字class是C++新引入的,C语言也已具备粗糙的struct类型。对于所有的意图和目的, C++ 的struct是 Cstruct的超集:几乎所有合法的 Cstruct也是合法的 C++struct,并有着相同的语义。

struct宣告组成一个字段清单,其中的每一个可以是任意类型。对于struct对象所需的存储区,即为全部字段的总合,再加上内部的补白。

例如:

struct Account { int account_number; char *first_name; char *last_name; float balance; };定义一个称为struct Account的类型。若要创建此类型的新变量,可以写为struct Account myAccount;,它有一个以myAccount.account_number访问的整数组件,且有一个以myAccount.balance访问的浮点数组件,以及first_name和last_name组件。myAccount包含这四个数值,且这四个字段可各自改变。由于struct account的写法有些累赘,在 C 代码中,typedef语句并不罕见,其为struct提供一个更简便的同义词。例如:

typedef struct Account_ { int account_number; char *first_name; char *last_name; float balance; } Account;在 C++ 中,并不需要typedef,因为使用了struct的类型定义,已是名字空间的一部分,所以该类型可称作struct Account或较简单的Account。

其它例子,一个使用了浮点数数据类型的三维向量复合类型,可如此创建:

struct Vector { float x; float y; float z; };一个以Vector复合类型为类型的变量名velocity,可以宣告为Vector velocity;,可以用点运算符(.)访问velocity的成员。例如,velocity.x = 5;,会使velocity的组件x等于 5。

同样地,一个颜色结构可如此创建:

struct Color { int red; int green; int blue; };原始子类型检查刚开始使用的struct,是用来建构组合数据类型,不过有时它是用来避开标准 C 协议,以创建原始子类型检查(primitive subtyping)。例如,共同的网络协议依赖于以下事实,C 编译器以可预料的方法,在结构字段之间补白;因此代码

struct ifoo_old_stub { long x, y; }; struct ifoo_version_42 { long x, y, z; char *name; long a, b, c; };void operate_on_ifoo(struct ifoo_old_stub *); struct ifoo_version_42 s;将可正确运作。

本词条内容贡献者为:

王慧维 - 副研究员 - 西南大学