Why are structs and classes so different?

Adam D Ruppe destructionator at gmail.com
Tue May 17 15:37:54 UTC 2022


On Tuesday, 17 May 2022 at 14:40:48 UTC, Kevin Bailey wrote:
> Foo foo;
>
> is undefined behavior waiting to happen, that I can't detect at 
> a glance.

It is actually perfectly well defined - for the class, it will be 
null, and this will kill the program if you use it.

You might not like that definition, but that's how it is defined.

> - A *secondary* goal would be for class objects to be able to 
> have deterministic destructors like structs.

they can with the `scope` keyword.

> The first looks trivial: Just have it allocate a Foo by default.

Worth noting that D *never* calls a user defined function on 
variable declaration; there are no default constructors.

Even if it is a struct, it never actually calls a constructor, it 
just copies over the default init value.

This is different than classes, which have some kind of 
constructor call any time you make one.


I think it is probably this default constructor stance that the 
rest flows from: a class is assumed to encapsulate some 
non-trivial state so it has a constructor, interfaces, object 
identities, etc. A struct is more of a plain collection of data.

Of course, in practice the lines are more blurred than that, but 
I think that's where it comes from. Especially if you look at the 
older D versions when structs didn't support constructors at all.


More information about the Digitalmars-d-learn mailing list