复合类型


复合类型 (正體)

Free Web Hosting with Website Builder

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

C/C++

主条目:C++结构和类别

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

在 C++ 里,struct 与一个类别的唯一区别是默认的存取等级,类别是私有的struct 则是公有的

注意类别和 C++ 的新关键字 classC语言也已具备粗糙的 struct 类型。对于所有的意图和目的,来自 C struct 超集的 C++ struct:事实上,所有有效的 C struct 也是有效的 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_namelast_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;
};

在三维图像中,必须经常不断追踪每一个顶点的位置和颜色。可以使用之前所建立的 VectorColor 复合类型来建立 Vertex 复合类型:

struct Vertex {
  Vector position;
  Color color;
};

以同样的格式建立一个 Vertex 类型的变量:Vertex v;,并给 v 赋值,如下:

  v.position.x = 0.0;
  v.position.y = 1.5;
  v.position.z = 0.0;
  v.color.red = 128;
  v.color.green = 0;
  v.color.blue = 255;

原始子类型

刚开始使用的 struct,是用来建构组合资料类型,不过有时它是用来避开标准 C 协定,以建立原始子类型。例如,共同的网络协议依赖于以下事实,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;
. . .
operate_on_ifoo(&s);

将可正确运作。

参阅

  • 物件组合






Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History