Существует множество передовых методов программирования на C++, которые предлагаются во многих статьях и книгах. Ниже приведено подмножество, относящееся к членам данных класса C++:Должны ли элементы класса Qt класса класса 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 член данных должен быть инициализирован, а когда инициализация не нужна и почему. Благодаря!
Я забыл упомянуть, что для всех классов Qt, участвующих в классе 'MyClass', мы можем предположить, что у них есть конструктор с 0 аргументами. То есть, доступны QString :: QString() ',' QList :: QList() 'и' QHash :: QHash() '. Исходя из этого предположения, исходный вопрос может привести к двум дополнительным вопросам: Q1: эквивалентны ли 2 версии MyClass :: MyClass() '? То есть они производят 2 объекта одного содержания? Q2: Является ли одна версия быстрее другой? – jonathanzh