首页 | 主题 | 图库 | 问答 | 文摘 | 原创 | 百科

历史 | 地理 | 人物 | 艺术 | 体育 | 科学 | 音乐 | 电影 | 信息技术 | 世界遗产

 开放、中立,源自维基百科

个人工具


複合類型

维库,知识与思想的自由文库

跳转到: 导航, 搜索

電腦科學中,複合類型是一種資料類型,它可以原始類型和其它的複合類型所構成。構成一個複合類型的動作,又稱作組合

[编辑] 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);

將可正確運作。

[编辑] 參閱

其它语言
AD Links