Это очень разные вещи.
QString str("my string");
создает объект, время жизни которого автоматически управляется : объект либо доживает до конца своей охватывающей области (если это локальная переменная), либо до конца программы (если это глобальная переменная).
new QString("my string");
создает объект с управляемым вручную временем жизни , также называемым "динамическим объектом" (и возвращает указатель на этот объект). Это означает, что вы несете ответственность за управление временем жизни объекта. Это почти никогда не будет правильным , если вы не пишете компонент библиотеки.
И в этом суть философии C ++: C ++ - это язык для написания библиотек. У вас есть инструменты для написания высококачественных, многократно используемых компонентов. Если и когда вы это сделаете, вам необходимо знать тонкости управления жизненным циклом. Однако с до тех пор, пока не наступит , вы должны использовать существующие компоненты библиотеки. При этом вы обнаружите, что вам почти никогда не потребуется выполнять какое-либо ручное управление.
Используйте динамические контейнеры (векторы, строки, карты и т. Д.) Для хранения данных и построения собственных структур данных. Передайте аргументы по ссылке, если вам нужно изменить объекты в области действия вызывающего. Создавайте сложные классы из более простых компонентов. Если вам действительно нужны динамические объекты, обработайте их с помощью классов-обработчиков unique_ptr<T>
или shared_ptr<T>
.
Не используйте указатели. Редко используйте new
, а delete
никогда.
(Дополнительные советы: 1) Никогда не используйте using namespace
, если это не для ADL. 2) Если вы не пишете библиотечные компоненты, хорошо спроектированные классы не должны иметь деструкторов, конструкторов копирования или операторов присваивания. Если они это сделают, выделите нарушающую логику в компонент библиотеки с единственной ответственностью, затем см. 2).)