Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to initialize member-struct in initializer list of C++ class?

I have the following class definitions in c++:

struct Foo {   int x;   char array[24];   short* y; };  class Bar {   Bar();    int x;   Foo foo; }; 

and would like to initialize the "foo" struct (with all its members) to zero in the initializer of the Bar class. Can this be done this way:

Bar::Bar()   : foo(),     x(8) { } 

... ?

Or what exactly does the foo(x) do in the initializer list?

Or is the struct even initialized automatically to zero from the compiler?

like image 969
Jan Rüegg Avatar asked Nov 17 '10 09:11

Jan Rüegg


People also ask

How do you initialize struct members?

When initializing an object of struct or union type, the initializer must be a non-empty, (until C23) brace-enclosed, comma-separated list of initializers for the members: = { expression , ... }

How do you initialize a struct in a class?

For instance, with this struct: struct Point { int x; int y; int z; }; We can initialize an instance with the following syntax: Point p = {1, 2, 3};

How do you initialize a struct in CPP?

// In C++ We can Initialize the Variables with Declaration in Structure. Structure members can be initialized using curly braces '{}'. For example, following is a valid initialization.

Can struct have Initializers?

Using designated initializers, a C99 feature which allows you to name members to be initialized, structure members can be initialized in any order, and any (single) member of a union can be initialized. Designated initializers are described in detail in Designated initializers for aggregate types (C only).


2 Answers

First of all, you should (must !) read this c++ faq regarding POD and aggregates. In your case, Foo is indeed a POD class and foo() is a value initialization :

To value-initialize an object of type T means:

  • if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor
    for T is called (and the initialization is ill-formed if T has no accessible default constructor);
  • if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;
  • if T is an array type, then each element is value-initialized;
  • otherwise, the object is zero-initialized

So yes, foo will be zero-initialized. Note that if you removed this initialization from Bar constructor, foo would only be default-initialized :

If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a nonstatic object, the object and its subobjects, if any, have an indeterminate initial value;

like image 138
icecrime Avatar answered Sep 24 '22 21:09

icecrime


In standard C++ you need to make a ctor for Foo.

struct Foo {    Foo(int const a, std::initializer_list<char> const b, short* c)     : x(a), y(c) {     assert(b.size() >= 24, "err");     std::copy(b.begin(), b.begin() + 24, array);   }    ~Foo() { delete y; }    int x;   char array[24];   short* y; };  class Bar {    Bar() : x(5), foo(5, {'a', 'b', ..., 'y', 'z'},     new short(5)) { }    private:    int x;   Foo foo; }; 

In C++0x you may use uniform initialization list, but still you need dtor for Foo:

class Bar {    Bar() : x(5), foo{5, new char[24]{'a', 'b', ..., 'y', 'z'},     new short(5)} { }   ~Bar() { delete[] foo.array; delete foo.y;}   }   private:    int x;   Foo foo; }; 

To default initialize foo (as Bar() : foo(), x(8) { }) you need to give Foo a default ctor.

like image 36
erjot Avatar answered Sep 22 '22 21:09

erjot