Rule A12-6-1 (required, implementation, automated)

All class data members that are initialized by the constructor shall be initialized using member initializers.

Rationale

Using the constructor’s member initializers is more efficient than assigning a copy of passed values to data members in the constructor’s body. Also, it supports the programmer to prevent “data usage before initialization” errors. Note that if a data member is already initialized using member initializer, then changing its value in the constructor’s body does not violate this rule.

Example

// $Id: A12-6-1.cpp 271696 2017-03-23 09:23:09Z piotr.tanski $
#include <cstdint>
#include <string>
class A

{
public:
A(std::int32_t n, std::string s) : number{n}, str{s} // Compliant
{
}
// Implementation

private:
std::int32_t number;
std::string str;

};
class B
{
public:
B(std::int32_t n, std::string s) // Non-compliant - no member initializers
{
number = n;
str = s;
}
// Implementation

private:
std::int32_t number;
std::string str;

};
class C
{
public:
C(std::int32_t n, std::string s) : number{n}, str{s} // Compliant
{
n += 1; // This does not violate the rule
str.erase(str.begin(),
str.begin() + 1);
// This does not violate the rule
}
// Implementation

private:
std::int32_t number;
std::string str;

};

See also

C++ Core Guidelines [11]: C.49: Prefer initialization to assignment in constructors.