Каков наиболее предпочтительный способ создания экземпляра класса на C ++?

Я изучал ООП на C ++, и есть разные способы создать экземпляр класса с помощью ключевого слова new или стандартным способом (который не использует new ).

Либо это с помощью нового

Class *object = new Class();

или стандартным способом

Class object;

Я не понимаю, когда использовать любой из способов. Может ли кто-нибудь уточнить, когда использовать или какой способ создания экземпляра является предпочтительным?


person mmdalire    schedule 02.03.2020    source источник
comment
Взгляните на это: stackoverflow.com/a/1764866/4022530   -  person Majid khalili    schedule 02.03.2020


Ответы (2)


В этом:

Object* o = new Object

вы создаете динамическое размещение, а o - указатель. Обычно это используется для экономии памяти путем ссылки или как реализация для списков и деревьев. Память указателя должна быть удалена с помощью delete, потому что, как только он выйдет за пределы области действия, объект все еще будет существовать, но у вас не будет доступа, это называется утечкой памяти.

В другом объявлении

Object o; // or Object o = Object()

Вы объявляете экземпляр объекта, а не указатель.

Указатель содержит ссылку на объект, а не на сам объект.

Итак, ответ на ваш вопрос зависит от предпочтительного способа, но обычно вы хотите использовать версию без новой.

person polmonroig    schedule 02.03.2020
comment
Ох! Теперь это имеет смысл. Спасибо за подробное разъяснение! - person mmdalire; 03.03.2020

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

В противном случае, если оператор new не используется, объект автоматически уничтожается, если выходит за пределы области видимости.

person LebRon    schedule 02.03.2020
comment
Спасибо за ваш ответ. Возможно, я просто избегу использования new / delete, чтобы избежать утечек памяти. - person mmdalire; 03.03.2020