Подтвердить что ты не робот

Создать новый экземпляр класса без "нового" оператора

Просто вопрос. Как следует из названия, я использовал только "новый" оператор для создания новых экземпляров класса, поэтому мне было интересно, что такое другой метод и как его правильно использовать.

4b9b3361

Ответ 1

У вас также могут быть автоматические экземпляры вашего класса, которые не используют new, как:

class A{};

//automatic 
A a;             

//using new
A *pA = new A();

//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();

//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();

Последние два используют place-new, который немного отличается от нового. placement-new используется для построения объекта путем вызова конструктора. В третьем примере malloc выделяет только память, он не вызывает конструктор, поэтому для создания объекта используется конструктор new-new.

Также обратите внимание, как удалить память.

  //when pA is created using new
  delete pA;

  //when pA is allocated memory using malloc, and constructed using placement-new
  pA->~A(); //call the destructor first
  free(pA); //then free the memory

  //when pA constructed using placement-new, and no malloc or new!
  pA->~A(); //just call the destructor, that it!

Чтобы узнать, что такое размещение, ознакомьтесь с этими часто задаваемыми вопросами:

Ответ 2

Вы можете просто объявить нормальную переменную:

YourClass foo;

Ответ 3

Любой из обычных способов: как локальная или статическая переменная, так и как временный. В общем, единственный раз, когда вы используете new в С++, когда объект имеет идентификатор и срок службы, который не соответствуют объему или когда он является полиморфным. (Есть исключения, конечно, но не так много.) Если объект может быть Скопировано, обычно предпочтительнее использовать локальные экземпляры, копировать по мере необходимости. (Точно так же, как и для int, на самом деле.)

Ответ 4

Использование malloc даст вам тот же результат, что и новый, без вызова конструктора.

Ответ 5

Большинство объектов в С++ не должны создаваться с использованием новых. Вместо этого вы должны создать их так же, как вы создадите целые числа или логические элементы:

class Person {
    ...
};


int main() {
    int x  = 3;
    boolean b = true;
    Person p( "fred" );
}

Создание объектов с новыми должно быть зарезервировано для случаев, когда вам нужен полиморфизм, или, возможно, когда вам нужно создать несколько объектов, но вы не знаете, сколько во время компиляции.