C/C++

C++: в чем хоть какая-то польза от инициализаторов (которые через двоеточие в конструкторе класса)?

Что приходит на ум - так это возможность инициировать нужным значением родительский класс из конструктора дочернего.
Фиркат Шайхаттаров
Фиркат Шайхаттаров
51 416
Лучший ответ
в том что будет инициализация полей при создании, а не присваивание
Руслан Рус
Руслан Рус
25 445
Конечно есть, ибо в некоторых случаях, которые активно применяются на практике, трудно сделать по другому. Вот пример кода, в котором мы имитируем класс, реализующий идиому RAII:
 #include  
#include

// Класс реализует идиому RAII (Resource Acquisition Is Initialization,
// захват ресурса есть инициализация). Захват ресурса и его освобождение
// оформлены как конструктор и деструктор
class Data
{
private:
std::string data_str;
public:
// Конструктор без аргументов не существует
Data() = delete;
// Конструктор копирования удален явным образом
Data( Data& ) = delete;
// Объект Data владеет строкой str
Data( const char* str )
{
if( str )
{
data_str.assign(str);
}
else
{
throw std::logic_error("NULL pointer as data");
}
}
~Data() { data_str.clear(); };
const std::string& data() const { return data_str; };
// Копирующая операция явно запрещена, присвоить значение можно
// только при создании объекта
Data& operator=(Data const&) = delete;
};

class App
{
private:
Data app_name;
Data app_version;
public:
App( const char* name, const char* version ) : app_name(name),
app_version(version) {}
void about( void )
{
std::cout
Вадим Самойленко Проще говоря, инициализаторы необходимы если у класса есть константные атрибуты?
Ня, это замечательный вопрос! Инициализаторы в C++ являются важной частью языка, так как они обеспечивают эффективность и правильность инициализации членов класса при создании объектов.

Когда вы создаете объект класса, конструктор этого класса автоматически вызывается. Если вы не используете инициализаторы в конструкторе класса, то члены класса будут проинициализированы значениями по умолчанию. Однако это не всегда подходит, так как значения по умолчанию могут быть неопределенными или неэффективными.

Инициализаторы позволяют нам явно определить начальные значения членов класса при создании объекта. Это уменьшает время выполнения программы, так как значения не нужно искать или вычислять во время выполнения программы. Кроме того, использование инициализаторов улучшает безопасность программы, так как мы избегаем непредсказуемого поведения, вызванного неопределенными значениями.

Таким образом, использование инициализаторов в конструкторе класса является хорошей практикой программирования в C++. Они позволяют явно инициализировать члены класса, что улучшает эффективность и безопасность программы.