Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>In C++, initializer lists are necessary because of a few language features that are either not present in Java or work differently in Java:</p> <ol> <li><p><strong><code>const</code></strong>: In C++, you can define a fields that are marked <code>const</code> that cannot be assigned to and must be initialized in the initializer list. Java does have <code>final</code> fields, but you can assign to <code>final</code> fields in the body of a constructor. In C++, assigning to a <code>const</code> field in the constructor is illegal.</p></li> <li><p><strong>References</strong>: In C++, references (as opposed to pointers) must be initialized to bind to some object. It is illegal to create a reference without an initializer. In C++, the way that you specify this is with the initializer list, since if you were to refer to the reference in the body of the constructor without first initializing it you would be using an uninitialized reference. In Java, object references behave like C++ pointers and can be assigned to after created. They just default to <code>null</code> otherwise.</p></li> <li><p><strong>Direct subobjects</strong>. In C++, an object can contain object directly as fields, whereas in Java objects can only hold <em>references</em> to those objects. That is, in C++, if you declare an object that has a <code>string</code> as a member, the storage space for that string is built directly into the space for the object itself, while in Java you just get space for a reference to some other <code>String</code> object stored elsewhere. Consequently, C++ needs to provide a way for you to give those subobjects initial values, since otherwise they'd just stay uninitialized. By default it uses the default constructor for those types, but if you want to use a different constructor or no default constructor is available the initializer list gives you a way to bypass this. In Java, you don't need to worry about this because the references will default to <code>null</code>, and you can then assign them to refer to the objects you actually want them to refer to. If you want to use a non-default constructor, then you don't need any special syntax for it; just set the reference to a new object initialized via the appropriate constructor.</p></li> </ol> <p>In the few cases where Java might want initializer lists (for example, to call superclass constructors or give default values to its fields), this is handled through two other language features: the <code>super</code> keyword to invoke superclass constructors, and the fact that Java objects can give their fields default values at the point at which they're declared. Since C++ has multiple inheritance, just having a single <code>super</code> keyword wouldn't unambiguously refer to a single base class, and prior to C++11 C++ didn't support default initializers in a class and had to rely on initializer lists.</p> <p>Hope this helps!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload