類型
基本數據類型
關鍵字 | 描述 | 默認初始值(.init) |
---|---|---|
void | 無類型 | - |
bit | single bit | false |
byte | signed 8 bits | 0 |
ubyte | unsigned 8 bits | 0 |
short | signed 16 bits | 0 |
ushort | unsigned 16 bits | 0 |
int | signed 32 bits | 0 |
uint | unsigned 32 bits | 0 |
long | signed 64 bits | 0L |
ulong | unsigned 64 bits | 0L |
cent | signed 128 bits(爲未來保留) | 0 |
ucent | unsigned 128 bits(爲未來保留) | 0 |
float | 32 bit 浮點數 | float.nan |
double | 64 bit 浮點數 | double.nan |
real | 硬件支持的最大的浮點數(實現注意:在 Intel CPU 上是 80 bits ) | real.nan |
ifloat | 虛 float | float.nan * 1.0i |
idouble | 虛 double | double.nan * 1.0i |
ireal | 虛 real | real.nan * 1.0i |
cfloat | 兩個 float 值構成的複數 | float.nan + float.nan * 1.0i |
cdouble | 複數 double | double.nan + double.nan * 1.0i |
creal | 複數 real | real.nan + real.nan * 1.0i |
char | unsigned 8 bit UTF-8 | 0xFF |
wchar | unsigned 16 bit UTF-16 | 0xFFFF |
dchar | unsigned 32 bit UTF-32 | 0x0000FFFF |
派生數據類型
- 指針
- 數組
- 函數
用戶定義數據類型
- 別名
- typedef
- 枚舉
- 結構
- 聯合
- 類
指針轉換
D 允許指針到非指針、非指針到指針的轉換,但是,決不要對指向由垃圾收集程序分配的數據的指針進行這樣的操作。隱式轉換
D 有許多類型,有一些是內建的,另一些是派生的。如果每次類型轉換都需要顯式轉型的話會是很麻煩的事,所以我們用隱式轉換來自動處理那些明顯的轉型。使用 typedef 聲明的類型可以被轉換爲它所代表的類型,但是反過來就必須進行顯式轉型。例如:
myint; i; myint m; i = m; m = i; m = (myint)i;
整數提升
下面的類型會被隱式提升爲 int :bit byte ubyte short ushort enum char wchar dchar使用 typedef 聲明的類型會被轉換爲它所代表的類型。
常用算數轉換
常見的算術轉換會將二元運算符的操作數轉換爲通用的類型。這個操作數必須已經是算術類型。下面的規則將會按順序應用:- 使用 typedef 聲明的類型會被轉換爲它所代表的類型。
- 如果有操作數是 real ,另一個操作數會被轉換爲 real 。
- 如果一個操作數是 double ,另一個操作數會被轉換爲 double 。
- 如果一個操作數是 float ,另一個操作數會被轉換爲 float 。
- 對每個操作數應用整數提升,然後:
- 如果兩個操作數類型相同,無需再作轉換。
- 如果兩個操作數都是有符號或無符號的,較小的類型會被轉換爲較大的類型。
- 如果有符號的類型比無符號的類型大,無符號的類型會被轉換爲有符號的類型。
- 否則有符號的類型會被轉換爲無符號的類型。
委託
D 中沒有成員指針,但支持一個更爲有用的概念—— 委託(delegates)。委託是兩塊數據的聚集:一個對象的引用和一個函數指針。當調用函數時,對象引用構造 this 指針。委託的聲明同函數指針的聲明很像,差別是關鍵字 delegate 替代了 (*) ,並且隨後跟着標誌符:
function() fp; delegate() dg;C 風格的聲明函數指針的語法也被支持:
(*fp)();委託同函數指針一樣被初始化:
func(); fp = &func; OB { member(); } OB o; dg = &o.member;委託不能用靜態成員函數或者非成員函數初始化。
委託同函數指針一樣調用:
fp(3); dg(3);