在 D 中定义复合类型或自定义类型的一种方法是结构体 struct:
struct Person {
int age;
int height;
float ageXHeight;
}
默认情况下 struct 构造在栈上(除非使用 new 构造),并且在赋值和传参中会复制值 。
auto p = Person(30, 180, 3.1415);
auto t = p; // 发生复制
当一个新的 struct 类型被创建时,其成员变量可以根据定义顺序被初始化。自定义的构造函数需要被定义在叫 this(... ) 的成员函数中。如果需要避免命名冲突,可以使用 this 来显式访问当前实例:
struct Person {
this(int age, int height) {
this.age = age;
this.height = height;
this.ageXHeight = cast(float)age * height;
}
...
Person p = Person(30, 180); // 初始化
p = Person(30, 180); // 赋值新的实例
一个 struct 可以包含任意数量成员函数。默认情况下他们都是 public 公开的可以被外部调用。函数也可以是 private 私有的只能被自己的其他成员函数或同一个模块中的函数访问,
struct Person {
void doStuff() {
...
private void privateStuff() {
...
// 在其他模块中调用
p.doStuff(); // 调用 doStuff
p.privateStuff(); // 调用 private 不行
如果一个成员函数被声明为 const,那么它就不能修改它的成员。编译器会强制检查。
const 成员函数可以被声明为 const 或 immutable 的函数调用,并且也向调用者保证不会改变对象状态。
如果一个成员函数被声明为 static,那么它可以在没有实例化对象时调用(例如:Person.myStatic())但它不能访问其他非 static 成员。如果一个方法不需要访问任何对象成员字段,但在逻辑上属于同一个类,则可以使用它。
此外,它可以用来提供一些无需显式创建实例的功能,例如,一些单例设计模式实现使用static。
注意 struct不能继承自其他的 struct。
可继承类型只能使用类来构建,我们将在后面的部分中看到这一点。不过,通过alias this 或 mixins,可以很容易地实现多态继承。
给定一个 struct Vector3, 实现以下函数使得实例程序成功运行:
length() - 返回 vector 的长度
dot(Vector3) - 返回两个 vector 的点积
toString() - 返回 vector 的字符串表达。
std.string.format 函数,可以使用类似于 printf 的语法并返回字符串:
format("MyInt = %d", myInt)。 字符串将在后面的部分中详细解释。