user2604179
user2604179

Reputation:

Initializing variables in a class

I'm studying computer engineering, my 2nd semester just began. I've been making Android applications for a few while.

My programming lecturer (teaches C++ (Object Oriented)) said we can't initialize variables in a class unless we use a constructor since there's no memory dedicated to those data members before making an object of that class.

He said this is incorrect:

class example
{
       int a = 0;
};

But my experience says something else:

I've made a class in my Android project that keeps my Constants. I don't make any objects of that class. I've initialized variables and never used a constructor. But it works fine:

public class Constants {

       public static final int a = 1;

}

I want to know how am I initializing variables when there's no memory dedicated to that variable and how it works.

What part of my story is wrong? I want to know how my code works when there's no memory dedicated to my variables (Constants)?

Upvotes: 1

Views: 96

Answers (2)

Filip Roséen
Filip Roséen

Reputation: 63797

The Truth

class A {
   int a = 0;
};

In-class initializers became legal in C++11; so the only conclusion to draw from what you have said is that your teacher is living in the past.

However, if he is teaching C++03 and not a later revision of the language, he's correct about it being ill-formed.


It is important to note that what he said regarding (non-static) data-members and their lack of storage until an object of such class has actually been created still applies.

An in-class initializer will initialize the data-member during construction, as long as the data-member isn't initialized in the used constructor's mem-initializer (then the latter takes precedence).

struct A {
  A () = default;
  A (int x)   : m (x) { }
  int m = 0; // ^ mem-initializer
};

A x;       // `x.m` is initialized to `0`
A y (123); // `y.m` is initialized to `123`

Further Reading

Upvotes: 4

T.C.
T.C.

Reputation: 137310

He said this is incorrect:

class example
{
       int a = 0;
}

Well, yes, it's incorrect, there needs to be a semicolon at the end, after the }.

With that semicolon, this is legal C++11; the = 0 is a non-static data member initializer (NSDMI for short). It's syntatic sugar for performing the equivalent initialization in the constructor.


public class Constants {

       public static final int a = 1;

}

static things are per-class, and exists even if no objects of that class is ever created. Non-static things are per-object.

Upvotes: 1

Related Questions