D语言中的类型

类型

基本数据类型

  • 关键字 描述 默认初始值(.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 声明的类型会被转换为它所代表的类型。

常用算数转换

常见的算术转换会将二元运算符的操作数转换为通用的类型。这个操作数必须已经是算术类型。下面的规则将会按顺序应用:
  1. 使用 typedef 声明的类型会被转换为它所代表的类型。
  2. 如果有操作数是 real ,另一个操作数会被转换为 real 。
  3. 如果一个操作数是 double ,另一个操作数会被转换为 double 。
  4. 如果一个操作数是 float ,另一个操作数会被转换为 float 。
  5. 对每个操作数应用整数提升,然后:
    1. 如果两个操作数类型相同,无需再作转换。
    2. 如果两个操作数都是有符号或无符号的,较小的类型会被转换为较大的类型。
    3. 如果有符号的类型比无符号的类型大,无符号的类型会被转换为有符号的类型。
    4. 否则有符号的类型会被转换为无符号的类型。

委托

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)
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值