Должен ли я использовать конструктор только для инициализации переменных в C ?

#c #oop #constructor

Вопрос:

Я новичок в ООП на C . У меня есть класс, которому не нужно запускать какой-либо код, и ему не нужны никакие параметры при создании объекта, если я все равно напишу конструктор только для инициализации переменных.
Я могу это сделать:

 #include <iostream>

class Something
{
private:
    const char* msg = "Hewwo World"; // i can initialise here
public:
    void Print()
    {
        for (int i = 0; i < 11;   i)
        {
            std::cout << *msg  ;
        }
    }
};

int main()
{
    Something smth;
    smth.Print();
}
 

вместо этого:

 #include <iostream>

class Something
{
private:
    const char* msg;
public:
    Something()
    {
        msg = "Hewwo World";
    }
    void Print()
    {
        for (int i = 0; i < 11;   i)
        {
            std::cout << *msg  ;
        }
    }
};

int main()
{
    Something smth;
    smth.Print();
}
 

оба дают один и тот же результат, и первый метод намного чище (по моему мнению). Есть ли какая — либо причина, по которой я должен использовать второй метод?

Комментарии:

1. Эти две программы эквивалентны. Неявно определенный конструктор по умолчанию в первом примере будет делать то же самое, что и предоставленный пользователем во втором.

2. Во втором случае было бы лучше использовать список инициализаторов в конструкторе. т. е. Something() : msg("Hewwo World") {} . Это делает пример эквивалентным первому (за исключением того факта, что конструктор генерируется компилятором в первом случае, а программистом во втором). Примерное эмпирическое правило — если вы можете достичь того же чистого эффекта, используя инициализатор элемента по сравнению с последующим назначением в теле конструктора, предпочитайте использовать инициализатор.

Ответ №1:

 const char* msg = "Hewwo World"; // i can initialise here
 

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

должен ли я по-прежнему писать конструктор только для инициализации переменных.

Зависит от случая, но довольно часто в этом нет необходимости. Простые классы часто полезны в качестве агрегатов. Предварительным условием для того, чтобы класс был агрегатом, является отсутствие в классе объявленных пользователем конструкторов.

Комментарии:

1. Примечание: Технически второй пример выполняет назначение msg , а не инициализацию, но я не думаю, что в общем случае существует оптимизатор, который не оптимизировал бы это до того же самого с char массивом. С чем-то более сложным, таким как класс со сложной логикой построения и назначения, вы могли бы увидеть некоторые небольшие различия. Нет определяемого пользователем конструктора по сравнению с определяемым пользователем конструктором с назначением в теле Версия без конструктора явно превосходит.

Ответ №2:

в этом конкретном коде вы не задаете классу никаких параметров, и нет необходимости инициализировать переменную msg в конструкторе. таким образом, конструктор не нужен.

используйте конструктор,если вы хотите, чтобы какая-либо переменная была инициализирована в момент создания объекта или когда вам нужно задать некоторые параметры классу, тогда вы можете использовать конструктор.