2016-03-12 1 views
1

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

+0

Я забыл упомянуть, что для всех классов Qt, участвующих в классе 'MyClass', мы можем предположить, что у них есть конструктор с 0 аргументами. То есть, доступны QString :: QString() ',' QList :: QList() 'и' QHash :: QHash() '. Исходя из этого предположения, исходный вопрос может привести к двум дополнительным вопросам: Q1: эквивалентны ли 2 версии MyClass :: MyClass() '? То есть они производят 2 объекта одного содержания? Q2: Является ли одна версия быстрее другой? – jonathanzh

ответ

5

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

Update:

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

Да.

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

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

+0

Мое понимание вашего ответа: если 'myQString(),' строка явно не помещается в список инициализаторов, компилятор будет неявно вызывать конструктор 0-аргумента 'QString'. Таким образом, 2 версии MyClass :: MyClass() 'выше будут создавать 2 объекта одного и того же контента и с аналогичным временем. Так что любая версия хороша, но первая версия может быть предпочтительной. Правильно ли я понимаю? Благодаря! – jonathanzh

+0

Я бы предпочел СУХОЙ (не повторяйся) Если компилятор делает то же самое от вашего имени, то почему вы хотите написать его самостоятельно, я бы предпочел вторую версию, потому что вы можете получить предупреждения о заказе и разрешить предупреждения вам потребуется время, чтобы увидеть порядок элементов данных в файле заголовка. –

+0

Спасибо за ваше подтверждение. Поскольку 2 версии эквивалентны, я предпочел бы первую версию. Я не против писать некоторые дополнительные строки кода, если код легче понять и поддерживать другими разработчиками. Это мое личное предпочтение. Если бы я был единственным разработчиком этого класса, я бы также выбрал вторую версию, как вы делали J – jonathanzh

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^