Joseph Wakeling wrote:
I also have some C++ experience, but it seems to be confusing as much as
complementary with respect to D ... :-)

Current source of confusion relates to declaring objects of a class whose
constructor takes input -- confusion because I can write,

        class Foo
        {
                int x;
                uint y;

                this()
                {
                        x = -1;
                        y = 2;
                }
        }

        void main()
        {
                Foo f;
        }

and have no problem, but if instead the constructor is,

        this(int z)
        {
                x = z;
                y = 2;
        }

... it seems like I have to write instead,

        auto f = new Foo(-1);

... and if I write as per C++,

        Foo f(-1);

... I get back a compiler error: "found 'f' when expecting ';' following
'statement'".  Am I right in thinking that the 'new' syntax is necessary when 
the
class has a constructor which takes input?

You have stumbled upon a major difference between C++ and D. In D, classes are reference types, and objects are allocated dynamically on the heap. This means that if you simply type

  Foo f;

then f is null -- it is a reference to absolutely nothing -- regardless of whether Foo defines a constructor. If you try to use it for anything, you will get a null dereference error.

To allocate a new object of type Foo, you use 'new':

  Foo f = new Foo;       // No constructor
  Foo f = new Foo(-1);

In both cases, f now points to a valid object of type Foo. The C++ syntax you are referring to does not work in D.

If you want more C++-like behaviour, i.e. if you want to allocate on the stack, use a struct:

  struct Bar
  {
      uint x = -1;
      uint y = 2;

      this(uint z) { x = z; }
  }


  Bar b;            // Use default x and y values
  Bar b = Bar(0);   // Set x = 0

Note that you can also allocate a struct on the heap by using 'new'. In this case, it returns a pointer:

  Bar* b = new Bar(123);


This creates confusion also because in C++ one associates 'new' with dynamic
allocation of memory, and it requires a consequent 'delete' statement.  I know
that D has GC, and I know that it also has 'delete' statements, but ... this one
is 'ouch' for me :-P

Now you see, 'new' is for dynamic memory allocation in D as well, it's just that for classes it is required. You normally don't need to worry about 'delete', as the GC will take care of deallocation.

-Lars

Reply via email to