D 如何调用struct';所有参数都具有默认值的自定义构造函数?
假设我有以下结构:D 如何调用struct';所有参数都具有默认值的自定义构造函数?,d,D,假设我有以下结构: import std.stdio; struct A { this (int arg = 1) { writeln("Correct constructor"); } this(); } 如何使用构造函数的默认值 …生成错误:构造函数app.A。这是不可调用的,因为它带有@disable注释。如果我从默认构造函数中删除@disable属性,我将不会执行自己的构造函数 还有,为什么不允许结构具有自定义默认构造函数?我不知道结构的作
import std.stdio;
struct A
{
this (int arg = 1) {
writeln("Correct constructor");
}
this();
}
如何使用构造函数的默认值
…生成错误:构造函数app.A。这是不可调用的,因为它带有@disable
注释。如果我从默认构造函数中删除@disable
属性,我将不会执行自己的构造函数
还有,为什么不允许结构具有自定义默认构造函数?我不知道结构的作用是什么,但您可以作弊并尝试重载静态opCall:
import std.stdio;
struct A {
static auto opCall() {
writeln("Correct constructor");
auto a = typeof(this).init;
return a;
};
};
void main() {
A a = A();
};
您不应该实现默认的结构构造函数(原因如下:) 删除
this()代码>代码中的行。你不需要它
如果您希望某些特定值成为默认值,只需在模块级别设置,并在整个应用程序中使用它。如以下示例所示:
import std.stdio;
struct A {
int a;
int b;
this (int arg = 1) {
a = arg;
// writeln("Correct constructor");
}
}
immutable(A) defA = A(5);
void main() {
A a1 = A(2);
writeln(a1); // output: A(2, 0)
// Or, init all to defaults
A a2 = A.init;
writeln(a2); // output: A(0, 0)
A a3 = A(); // same as A.init, as you can see
writeln(a3); // output: A(0, 0)
A a4 = defA; // Let's use our "default" value
a4.b = 10;
writeln(a4); // output: A(5, 10)
}
不。它只在第二次调用时调用“Correct construcor”(a2=A(2)
)。第一个调用默认构造函数,该构造函数用零初始化所有内容,并且从不执行自定义代码。第一个是结构初始化器。我没有说它将使用默认参数执行构造函数。第二个是。我将编辑我的帖子以避免这种误解。这似乎是有效的。有多少欺骗行为?我应该期待任何副作用吗?例如,我注意到,当我用A A=A.init
替换main中的行时,静态opCall不会被调用,但这与我无关。@AdamRyczkowski:我主要关心的是A.\u ctor
不存在于这种方法中,这可能会干扰一些内省技术。老实说,我对静态opCall
没有太多经验,但我怀疑它在大多数用例中都能正常工作。另外,正如您所指出的,.init
永远不会调用函数,因为它会编译成一个简单的mov
或rep movs
(x86)来编写默认字段值。
import std.stdio;
struct A {
int a;
int b;
this (int arg = 1) {
a = arg;
// writeln("Correct constructor");
}
}
immutable(A) defA = A(5);
void main() {
A a1 = A(2);
writeln(a1); // output: A(2, 0)
// Or, init all to defaults
A a2 = A.init;
writeln(a2); // output: A(0, 0)
A a3 = A(); // same as A.init, as you can see
writeln(a3); // output: A(0, 0)
A a4 = defA; // Let's use our "default" value
a4.b = 10;
writeln(a4); // output: A(5, 10)
}