Рассмотрим следующую программу (подробнее см видеодемонстрацию 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 и делал его по умолчанию. Но класс - это не единственный способ определить типы пользователей, поэтому не забывайте о структуре! –