Всегда ли оператор `new` вызывает конструктор? - PullRequest
0 голосов
/ 17 мая 2018

На мой вопрос повлиял второй комментарий профессора Томаса Кормена на его ответ Quora $ .

Он говорит, что конструктор несетследующие три задачи:

  1. Выделяет память для объекта.

  2. Инициализирует переменные экземпляра объекта, например, с помощьюнеявно вызывая init в Python.(Я также подчеркиваю, что метод init должен инициализировать не некоторые, а все переменные экземпляра.)

  3. Возвращает ссылку на (т. Е. Адрес)object.

Однако в документации MSDN для C ++ * говорится, что оператор new делает это:

Выделяет память для объекта или массива объектов типа имя из бесплатного хранилища и возвращает ненулевой указатель на объект с подходящим типом.

Мой вопроскто прав?Или есть что-то еще, например, оператор new всегда вызывает конструктор, как предполагает комментарий к сообщению?

Спасибо.

$ К сожалению,Quora не имеет возможности скопировать ссылку для комментария - я могу сделать это только для ответа.
* Хотя я говорю C ++, я думаю, что это также верно для других языков, таких как Java иC # (хотя я не уверен на 100%).

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Если вы ищете constructor на связанной странице MSDN, это говорит:

Когда new используется для выделения памяти для объекта класса C ++, конструктор объекта вызывается после выделения памяти.

Другими словами, конструктор вызывается, если он существует. Если ни один не существует, ни один не называется.

0 голосов
/ 17 мая 2018

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

Полупсевдокод здесь:

template <typename T>
T* new(Args... arguments_to_constructor_of_T_if_any)
{
    void* mem = malloc(sizeof(T)); // Allocate memory 

    // Call constructor 
    // Compiler will produce machine code to construct object T over memory mem.
    (mem) T(arguments_to_constructor_of_T_if_any); 

    return (T*)(mem);
}

Пример:

class A
{
   int a;
   int b;

   A(int a, int b) { this->a = a; this->b = b; };
}

int main() 
{
   A* a = new A(3, 4);

   // After compiled, code above will look like : 
   void* mem = malloc(sizeof(A));

   // Below is A(int, int) constructor
   ((T*) mem)-> a = 3;
   ((T*) mem)-> b = 4;
}
0 голосов
/ 17 мая 2018

В случае сомнений прочитайте спецификацию.From ru.cppreference.com

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...