Должны ли члены класса Qt данных класса C++ инициализироваться перед использованием?
Существует множество лучших практик программирования на С ++, которые предлагаются во многих статьях и книгах. Ниже приводится подмножество, относящееся к членам данных класса C++:
- Убедитесь, что объекты инициализированы перед использованием.
- Убедитесь, что все конструкторы инициализируют все в объекте.
- Обычно более эффективно инициализировать элементы данных в списке инициализаторов каждого конструктора, чем в его теле.
- В списке инициализаторов элементы данных должны быть перечислены в порядке их объявления.
Рассмотрим следующий класс с членами-данными типов классов 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 и убедиться, что это правда с открытым исходным кодом!:)