D语言的struct是一个简单的数据集合。它属于值类型;它不支持构造、析构函数,不支持虚函数,不支持继承,如果需要这些特性,则应该使用class。D语言的struct能实现所有C语言的功能。按照C++的属于,D语言的struct属于“Plain Old Data”类型。
下面是一些D语言的特性的演示代码。
下面是一些D语言的特性的演示代码。
import std.stdio;
void main()
{
tryStructs();
}
void tryStructs()
{
// 和C#类似,class是引用类型,而struct是值类型
// static initialization
//----------------------------------
struct X
{
int a;
int b = 99;
}
X x; // x.a调用默认初始化,值为0,x.b初始化为我们指定的值--99
writefln("x.a = ", x.a, ", X.b = ", x.b);
static X x2 = {a:5, b:6}; // D的一种初始化方式
static X x3 = {5, 6}; // C风格的初始化
// dynamic initialization
//------------------------------------
struct S
{
float x;
float y;
static S opCall(float s)
{
S r;
r.x = r.y = s;
return r;
}
static S opCall(float _x, float _y)
{
S r;
r.x = _x;
r.y = _y;
return r;
}
}
S s1;
s1.x = 0;
s1.y = 1;
// struct 不支持构造函数,使用opCall可以方便书写
S s2 = 9; // 调用opCall
writefln("s2.x = ", s2.x, ", s2.y = ", s2.y);
S s3 = (5,6); //调用opCall
s3 = S(8,9);
writefln("s3.x = ", s3.x, ", s3.y = ", s3.y);
// struct properties
//---------------------------------
writefln("sizeof = ", s3.sizeof,
", alignof = ", s3.alignof,
", tupleof = ", s3.tupleof,
", offset of x = ", S.x.offsetof,
", offset of y = ", S.y.offsetof);
// union
//------------------------------------
union U
{
int n;
float f;
}
static U u1 = {f:1.0f};
writefln("u1.f = ", u1.f,
", u1.n = ", u1.n);
}
void main()
{
tryStructs();
}
void tryStructs()
{
// 和C#类似,class是引用类型,而struct是值类型
// static initialization
//----------------------------------
struct X
{
int a;
int b = 99;
}
X x; // x.a调用默认初始化,值为0,x.b初始化为我们指定的值--99
writefln("x.a = ", x.a, ", X.b = ", x.b);
static X x2 = {a:5, b:6}; // D的一种初始化方式
static X x3 = {5, 6}; // C风格的初始化
// dynamic initialization
//------------------------------------
struct S
{
float x;
float y;
static S opCall(float s)
{
S r;
r.x = r.y = s;
return r;
}
static S opCall(float _x, float _y)
{
S r;
r.x = _x;
r.y = _y;
return r;
}
}
S s1;
s1.x = 0;
s1.y = 1;
// struct 不支持构造函数,使用opCall可以方便书写
S s2 = 9; // 调用opCall
writefln("s2.x = ", s2.x, ", s2.y = ", s2.y);
S s3 = (5,6); //调用opCall
s3 = S(8,9);
writefln("s3.x = ", s3.x, ", s3.y = ", s3.y);
// struct properties
//---------------------------------
writefln("sizeof = ", s3.sizeof,
", alignof = ", s3.alignof,
", tupleof = ", s3.tupleof,
", offset of x = ", S.x.offsetof,
", offset of y = ", S.y.offsetof);
// union
//------------------------------------
union U
{
int n;
float f;
}
static U u1 = {f:1.0f};
writefln("u1.f = ", u1.f,
", u1.n = ", u1.n);
}