在 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)
。 字符串将在后面的部分中详细解释。