Почему множественный вызов конструктора создаёт только один объект?

В C++, множественный вызов конструктора создаёт только один объект, потому что конструктор является специальным методом класса, предназначенным для инициализации объекта при его создании. Когда вы вызываете конструктор класса, происходит выделение памяти под новый объект и его инициализация.

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

Конструктор копирования используется для создания нового объекта на основе существующего объекта того же класса. Это происходит, когда вы присваиваете один объект другому, передаёте объект по значению в функцию, или создаёте новый объект на основе существующего с использованием оператора копирования.

Например, если у вас есть класс Person, то конструктор копирования может быть определен следующим образом:

class Person {
public:
    // Конструктор копирования
    Person(const Person& other) {
        // Копируем данные из другого объекта
        name = other.name;
        age = other.age;
    }

private:
    std::string name;
    int age;
};

Когда вы создаёте новый объект Person на основе существующего объекта, вызывается конструктор копирования. Например:

Person p1("Alice", 25);
Person p2 = p1; // Вызывается конструктор копирования

В этом примере, создаётся новый объект p2 на основе существующего объекта p1 путём вызова конструктора копирования. Оба объекта будут иметь одинаковые значения для name и age, но это по-прежнему будет два отдельных объекта.

Точно так же, если у вас есть перемещающий конструктор, он будет вызываться при создании нового объекта на основе существующего объекта, который будет перемещён:

class Person {
public:
    // Перемещающий конструктор
    Person(Person&& other) noexcept {
        // Перемещаем данные из другого объекта
        name = std::move(other.name);
        age = std::move(other.age);
    }

private:
    std::string name;
    int age;
};

Person p1("Alice", 25);
Person p2 = std::move(p1); // Вызывается перемещающий конструктор

В этом примере, объект p1 будет перемещён в новый объект p2 путём вызова перемещающего конструктора. Обычно перемещающий конструктор используется для эффективного перемещения ресурсов из одного объекта в другой, минимизируя необходимость копирования данных.

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