类型
基本数据类型
关键字 描述 默认初始值(.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 声明的类型可以被转换为它所代表的类型,但是反过来就必须进行显式转型。例如:
typedef int myint; int i; myint m; i = m; // OK m = i; // 错误 m = cast(myint)i; // OK
整数提升
下面的类型会被隐式提升为 int :bit byte ubyte short ushort enum char wchar dchar使用 typedef 声明的类型会被转换为它所代表的类型。
常用算数转换
常见的算术转换会将二元运算符的操作数转换为通用的类型。这个操作数必须已经是算术类型。下面的规则将会按顺序应用:- 使用 typedef 声明的类型会被转换为它所代表的类型。
- 如果有操作数是 real ,另一个操作数会被转换为 real 。
- 如果一个操作数是 double ,另一个操作数会被转换为 double 。
- 如果一个操作数是 float ,另一个操作数会被转换为 float 。
- 对每个操作数应用整数提升,然后:
- 如果两个操作数类型相同,无需再作转换。
- 如果两个操作数都是有符号或无符号的,较小的类型会被转换为较大的类型。
- 如果有符号的类型比无符号的类型大,无符号的类型会被转换为有符号的类型。
- 否则有符号的类型会被转换为无符号的类型。
委托
D 中没有成员指针,但支持一个更为有用的概念—— 委托(delegates)。委托是两块数据的聚集:一个对象的引用和一个函数指针。当调用函数时,对象引用构造 this 指针。委托的声明同函数指针的声明很像,差别是关键字 delegate 替代了 (*) ,并且随后跟着标志符:
int function(int) fp; // fp 是指向函数的指针 int delegate(int) dg; // dg 是函数的委托C 风格的声明函数指针的语法也被支持:
int (*fp)(int); // fp 是指向函数的指针委托同函数指针一样被初始化:
int func(int); fp = &func; // fp 指向 func class OB { int member(int); } OB o; dg = &o.member; // dg 是 object o 的成员函数 // member 的委托委托不能用静态成员函数或者非成员函数初始化。
委托同函数指针一样调用:
fp(3); // 调用 func(3) dg(3); // 调用 o.member(3)