请考虑下面的程序(参见现场演示here)为什么D不允许在堆栈上创建对象?
import std.stdio;
class myclass
{
public:
int get_a()
{
return a;
}
private:
int a=3;
}
int main()
{
myclass m; // It should be myclass m=new myclass();
writefln("%d",m.get_a());
return 0;
}
C++支持自动(堆栈分配的)&动态(堆上分配)的对象。但为什么每个类对象都必须在D中动态分配?为什么D不支持堆栈分配对象?
另一个令人惊讶的是ideone
会产生编译错误为:
prog.d(14): Error: null dereference in function _Dmain
但是,当我尝试了我的DMD2编译本地机器上它给了我运行时错误不是编译时错误。为什么?为什么这个程序的行为不同? 以下是我在dmd2给出的本地机器上发生的错误。
[email protected](0): Access Violation
----------------
0x00402056
0x00405F9B
0x00405EB1
0x00403D93
0x7651EE6C in BaseThreadInitThunk
0x7758377B in RtlInitializeExceptionChain
0x7758374E in RtlInitializeExceptionChain
“所有变量都是参考”比较常见。在我熟悉的语言中,像C和C++这样的允许你用值语义定义类型的东西是例外,而不是规则。 – Hurkyl
D允许您使用值语义定义类型,就像结构而不是类一样。类总是通过引用来访问,但是分配内存的地方是由你自己决定的 - 包括在堆栈中。类始终是通过引用的原因在于,无论如何,即使在C++中,几乎总是您要这样做的方式 - 所以D遵循Java的领先地位并将其设置为默认值。但是类不是定义用户类型的唯一方式,所以不要忘记struct! –