Classes and class hierarchies
C.49
Предпочитайте инициализацию назначению в конструкторах
Причина
Инициализация явно указывает, что выполняется инициализация, а не присваивание, и может быть более элегантной и эффективной. Предотвращает ошибки "использование перед установкой".
Пример, хорошо
class A { // Хорошо
string s1;
public:
A(czstring p) : s1{p} { } // ХОРОШО: прямое построение (и C-строка явно названа)
// ...
};
Пример, плохо
class B { // ПЛОХО
string s1;
public:
B(const char* p) { s1 = p; } // ПЛОХО: конструктор по умолчанию с последующим присваиванием
// ...
};
class C { // НЕКРАСИВО, т.е. очень плохо
int* p;
public:
C() { cout << *p; p = new int{10}; } // случайное использование перед инициализацией
// ...
};
Пример, еще лучше
Вместо этих const char* мы могли бы использовать C++17 std::string_view или gsl::span<char> как более общий способ представления аргументов для функции:
class D { // Хорошо
string s1;
public:
D(string_view v) : s1{v} { } // ХОРОШО: прямое построение
// ...
};