knowledge
knowledge

Reputation: 1025

Instance variable initialization in C++ private area

In class A,counter b(5); doesn't work.

while counter a; (the call of the default constructor) works.

Why? Is it not possible to call a parameterized constructor for an instance variable?

class counter {
private:
  int value;
public:
  counter() { this->value = 0; }
  counter(int value) { this->value = value; }
};

class A {
  private:
    // works
    counter a;
    // works (since C++11)
    int x = 5; 
    // doesn't work
    counter b(5);
};

int main()
{
// works
counter myCounter;
// works as well
counter mySecondCounter(5);
return 0;
}

Upvotes: 2

Views: 3301

Answers (4)

Saurav Sahu
Saurav Sahu

Reputation: 13994

If allowed, counter b(5); technically declares a function named b that returns a counter object by value, and takes a single argument that's an integer.

While that, very likely, would not be the intention of the coder, that's why it is not allowed.

In Bjarne's words about this rule for In-Class Initializers:

We can specify an initializer for a non-static data member in the class declaration. For example:

class A {
  public:
    int a {7};
    int b = 77;
};

For pretty obscure technical reasons related to parsing and name lookup, the {} and = initializer notations can be used for in-class member initializers, but the () notation cannot.

Upvotes: 3

ibezito
ibezito

Reputation: 5822

In C++, this is not the correct syntax for initializing members with default values.

There are two options to solve it:

1.use operator =

counter b = counter(5);

2.use constructor with initialization list

A() : a(),b(5) {}

Upvotes: 1

Jonas
Jonas

Reputation: 7017

You have four options:

class A {
private:
    counter C1{5};

    // Works, only with single parameter constructors
    counter C2 = 5;

    // Works, with any number of parameters
    counter C3 = counter(5);

    counter C4;

    // Constructor initializer list, works with any number of parameters
    A() : C4(5) {}
};

Upvotes: 1

lfgtm
lfgtm

Reputation: 1047

It is possible. Change

counter b(5);

to

counter b = counter(5);

It is perhaps more elegant to initialise in a constructor intialisation list.

class A {
private:
    A() : b(5) {}

    counter a;
    int x = 5;
    counter b;
};

Upvotes: 1

Related Questions