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

Существует множество лучших практик программирования на С ++, которые предлагаются во многих статьях и книгах. Ниже приводится подмножество, относящееся к членам данных класса C++:

  1. Убедитесь, что объекты инициализированы перед использованием.
  2. Убедитесь, что все конструкторы инициализируют все в объекте.
  3. Обычно более эффективно инициализировать элементы данных в списке инициализаторов каждого конструктора, чем в его теле.
  4. В списке инициализаторов элементы данных должны быть перечислены в порядке их объявления.

Рассмотрим следующий класс с членами-данными типов классов Qt:

class MyClass {
public:
    myClass();
    ~myClass();
private:
    int myInt;
    QString myQString;
    QList<QString> myQList;
    QHash<int, QString> myQHash;
    char * pChar;
};

Используя приведенные выше рекомендации, код конструктора будет выглядеть следующим образом:

MyClass::MyClass() :
    myInt(0),    // OK, primitive should be initialized.
    myQString(),    // Is this really needed?
    myQList(),     // Is this really needed?
    myQHash(),    // Is this really needed?
    pChar(NULL)    // OK, pointer should be initialized.
{
}

Однако у меня сложилось впечатление, что не все члены класса Qt необходимо инициализировать. Но я не уверен на 100 % в этом. Некоторые разработчики утверждают, что, помещая все элементы данных в список инициализации, мы можем избежать пропуска инициализации некоторых важных элементов данных, которые должны быть инициализированы. Однако, если это реальная проблема, я бы предпочел поместить строку комментария для каждого элемента данных, который не нужно инициализировать, например:

MyClass::MyClass() :
    myInt(0), 
    //myQString(),
    //myQList(),
    //myQHash(),
    pChar(NULL) 
{
}

Подводя итог, я хотел бы знать, когда элемент данных класса Qt должен быть инициализирован, и когда инициализация не требуется, и почему. Спасибо!

2 ответа

Решение

Если у вас нет конструктора по умолчанию для класса, вы должны инициализировать его в списке инициализаторов, и не требуется вызывать конструктор по умолчанию в списке инициализаторов. Это не специфично для Qt, это общее правило для любого класса. Если у вас есть конструктор по умолчанию (который принимает 0 аргументов), даже если вы не вызываете его в списке инициализаторов, он будет вызван автоматически.

Обновить:

Q1: 2 версии MyClass::MyClass() выше эквивалентны? То есть они производят 2 объекта одного и того же контента?

Да.

Q2: одна версия быстрее, чем другая?

Вы можете набрать вторую версию быстрее;-), разницы в производительности нет.

По умолчанию конструктор QObject будет вызываться независимо от того, вызываете ли вы его явно или неявно, когда создается ваш объект.

Вы можете поместить отладочное сообщение в код конструктора QObject и убедиться, что это правда с открытым исходным кодом!:)

Другие вопросы по тегам