Помимо того факта, что возвращение конструктору чего-либо даст конструкторам две вещи вместо одной (что обычно нежелательно), обратите внимание, что конструкторы не могут быть названы, поэтому их нельзя вызывать явно.
Поскольку невозможно создать выражение, которое является явным вызовом конструктора, в любом случае было бы невозможно присвоить или обратиться к возвращаемому значению конструктора.
Попытка вернуть что-либо изконструктор просто не вписывается в дизайн языка.
Конструкторы не «возвращают» объекты, они инициализируют объекты в той области памяти, в которой они вызываются.Если вы объявляете объект типа класса со статической продолжительностью хранения (и этот тип имеет объявленный пользователем конструктор), память резервируется для времени жизни программы, и реализация гарантирует, что конструктор вызывается для инициализации объекта в этом местев соответствующее время в программе.
Аналогично, если вы объявляете и возражаете с автоматическим хранением, реализация резервирует пространство (неофициально некоторое пространство стека) и вызывает конструктор каждый раз, когда выполняется оператор объявления.
В случае нового выражения память выделяется динамически, и реализация вызывает соответствующий конструктор для инициализации объекта.
Обратите внимание, что если X
является типом класса, то X
во всех этих утверждениях всегда ссылается на имя типа и никогда на конструктор, который на самом деле не имеет имени.Синтаксис объявления или определения конструктора является специальным, это не означает, что у конструктора есть имя.Предположим, что X
имеет объявленный пользователем конструктор.
X x; // Initialize an object of type X using the default constructor
X(); // Value initialize a temporary of type X. Not an explicit constructor call.
new X(); // new expression: value-initialize a dynamically allocated X
X(a); // A function style cast
X(a, b); // Construct an X from the expression list. X must have a
// suitable constructor but the X still refers to the type.