Search code examples
c++initialization-list

Initialize const member variables


I have C++ code that boils down to something like the following:

class Foo{
    bool bar;
    bool baz;
    Foo(const void*);
};
Foo::Foo(const void* ptr){
    const struct my_struct* s = complex_method(ptr);
    bar = calculate_bar(s);
    baz = calculate_baz(s);
}

Semantically, the bar and baz member variables should be const, since they should not change after initialization. However, it seems that in order to make them so, I would need to initialize them in an initialization list rather than assign them. To be clear, I understand why I need to do this. The problem is, I can't seem to find any way to convert the code into an initialization list without doing one of the following undesirable things:

  • Call complex_method twice (would be bad for performance)
  • Add the pointer to the Foo class (would make the class size needlessly large)

Is there any way to make the variables const while avoiding these undesirable situations?


Solution

  • If you can afford a C++11 compiler, consider delegating constructors:

    class Foo
    {
        // ...
        bool const bar;
        bool const baz;
        Foo(void const*);
        // ...
        Foo(my_struct const* s); // Possibly private
    };
    
    Foo::Foo(void const* ptr)
        : Foo{complex_method(ptr)}
    {
    }
    
    // ...
    
    Foo::Foo(my_struct const* s)
        : bar{calculate_bar(s)}
        , baz{calculate_baz(s)}
    {
    }
    

    As a general advice, be careful declaring your data members as const, because this makes your class impossible to copy-assign and move-assign. If your class is supposed to be used with value semantics, those operations become desirable. If that's not the case, you can disregard this note.