C ++: в чем разница между новым Object () и Object () - PullRequest
1 голос
/ 25 апреля 2011

, поэтому в C ++ вы можете создавать экземпляры объектов, используя новое ключевое слово или иное ...

Object o = new Object();

, но вы также можете просто сделать

Object o = Object();

в чем именно разница b /w два и почему я должен использовать один над другим?

Ответы [ 3 ]

14 голосов
/ 25 апреля 2011

Вы не можете сделать Object o = new Object(); Оператор new возвращает указатель на тип.Это должно быть Object* o = new Object(); Экземпляр Object будет в куче .

Object o = Object() создаст экземпляр Object в стеке ,Мой C ++ ржавый, но я верю, что хотя это наивно выглядит как создание, за которым следует присвоение, на самом деле это будет просто вызов конструктора.

3 голосов
/ 25 апреля 2011

Первый тип:

Object* o = new Object();

Создает новый объект в куче и присваивает адрес o.Это только вызывает конструктор по умолчанию.По завершении вам придется вручную освободить память, связанную с объектом.

Второй тип:

Object o = Object();

Создает объект в стеке с использованием конструктора по умолчанию, а затем вызывает назначениеконструктор на о.Большинство компиляторов исключают вызов присваивания, но если у вас есть (предполагаемые или иные) побочные эффекты в операции присваивания, вы должны принять это во внимание.Обычный способ добиться создания нового объекта без вызова операции присваивания:

Object o; // Calls default constructor
0 голосов
/ 09 ноября 2017

Я искал вопрос, как указано выше, но с вариациями, поэтому я добавлю свой вопрос сюда

Я заметил разницу в компиляторе visual studio 2015 и gcc v4.8.5.

class Object
{
public:
x=0;
void display(){ std::cout<<" value of x:   "<<x<<"\n";}
};

Object *o = new Object;
o->display(); // this gives garbage to this->x , uninit value in visualstudio compiler and //in linux gcc it inits this->x to 0

Object *o = new Object(); // works well
o->display();
...