Constants?
Zarathustra
adam.chrapkowski at gmail.com
Wed Feb 11 13:47:28 PST 2009
For more documentation:
d1:
const:
<http://www.digitalmars.com/d/1.0/attribute.html#const>
final:
<http://www.digitalmars.com/d/1.0/class.html#Final>
invariant:
<http://www.digitalmars.com/d/1.0/class.html#Invariant>
enums:
<http://www.digitalmars.com/d/1.0/enum.html>
d2:
const and invariant
<http://www.digitalmars.com/d/2.0/const3.html>
final:
<http://www.digitalmars.com/d/2.0/class.html>
enums:
<http://www.digitalmars.com/d/2.0/enum.html>
Jarrett Billingsley Wrote:
> On Wed, Feb 11, 2009 at 4:09 PM, Mike L. <mike.linford at gmail.com> wrote:
> > Could someone lay out for me the different ways of doing constants in D (d1, particularly)? I've heard things about const, final, invariant, and "anonymous enums"?
> >
>
> OK, D1 doesn't have constness in the way that C/C++ and D2 do. D1
> only has constants and enums.
>
> A constant is created with 'const':
>
> const int x = 5;
> const message = "hello"; // uses type inference to infer char[5]
>
> 'const' actually has different behavior depending on where it's used.
> It's always used to declare variables (you can't put it on params, for
> instance), but if you use 'const' as a class member:
>
> class A
> {
> const int x;
>
> this(int x)
> {
> this.x = x; // OK
> // this.x++; // NOT ok
> }
> }
>
> it works like the Java "final", in which case there is a copy of it in
> each instance of A, but it can only be assigned once and it must be
> assigned in the constructor.
>
> If you want to dynamically initialize a module-level const, you can do
> so in a static this():
>
> const int x;
>
> static this()
> {
> x = something();
> }
>
> Again, x can only be assigned to once, and it must be assigned in the
> static this().
>
> 'final' does not work the way it does in Java. 'final' was used to
> mean more or less the same thing as in Java when D2 was new, but that
> usage has been dropped.
>
> 'const' (and the other qualifier 'invariant') mean different things in
> D2; I won't get into that here unless you really want to know.
>
> The other kind of constant that D1 has is enumerations. Enumerations
> can be named:
>
> enum Foo { Bar = 3 }
>
> So Foo.Bar is a constant with the value 3. Or they can be anonymous:
>
> enum { Baz = 5 }
>
> Baz is a constant with the value 5.
>
> Enumerations differ from consts in that they do not consume any space
> in the final outputted object/library/executable, whereas consts do.
> This has actually been significant in some cases: the Windows header
> ports, for instance, used the "const int Blah = ..." form for many
> many constants, bloating the outputted object files by several dozens
> of kilobytes. The "enum: int { Blah = ... }" form consumes no extra
> space in the executable.
>
> Also: in D2, "enum" can be used as a storage class, like "const" or
> "invariant", in which case the idea of "not taking any space in the
> output" is preserved:
>
> invariant int x = 5; // constant, but in the object files
> enum int y = 5; // not in the object files
More information about the Digitalmars-d-learn
mailing list