【发布时间】:2016-02-27 05:22:17
【问题描述】:
考虑以下程序(查看现场演示here)
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 给出的错误。
object.Error@(0): Access Violation
----------------
0x00402056
0x00405F9B
0x00405EB1
0x00403D93
0x7651EE6C in BaseThreadInitThunk
0x7758377B in RtlInitializeExceptionChain
0x7758374E in RtlInitializeExceptionChain
【问题讨论】:
-
“所有变量都是引用”是相当常见的。在我熟悉的语言中,像 C 和 C++ 这样允许你用值语义定义类型的东西是例外,而不是规则。
-
D 确实允许您定义具有值语义的类型,就像结构而不是类一样。类总是通过引用来访问,但是你在哪里分配它引用的内存取决于你——包括在堆栈上。类总是通过引用的原因是这几乎总是你想要的方式 - 即使在 C++ 中 - 所以 D 遵循 Java 的领先地位并将其设为默认值。但是类并不是定义用户类型的唯一方法,所以不要忘记 struct!
标签: class object heap-memory d stack-memory