Почему мы не можем ничего вернуть от конструктора? - PullRequest
0 голосов
/ 22 апреля 2011

C ++ говорит, что мы не можем ничего вернуть из конструктора? Какова историческая причина этого? Почему Бьярне запретил конструкторам возвращать что-то непохожее на другие функции-члены?

Ответы [ 6 ]

4 голосов
/ 22 апреля 2011

Потому что, когда объект создается в операторе new или в инициализаторе переменной, возвращаемый объект - это тот новый объект, который создается. Что бы вы сделали с объектом, возвращенным конструктором? Это никогда не могло быть возвращено никуда; это конструируемый объект, который возвращается. Этот объект уже (частично) был создан до вызова конструктора (в противном случае у конструктора не было бы объекта для работы), и он должен быть тем, что возвращается конструктором, поэтому нет смысла делать пользователя верните его или позвольте им запутаться, пытаясь вернуть что-то другое.

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

Я думаю, что конструктор возвращает себя, но без необходимости иметь return оператор.

Если он вернет себя, он не сможет ничего больше вернуть.

2 голосов
/ 22 апреля 2011

Помимо того факта, что возвращение конструктору чего-либо даст конструкторам две вещи вместо одной (что обычно нежелательно), обратите внимание, что конструкторы не могут быть названы, поэтому их нельзя вызывать явно.

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

Попытка вернуть что-либо изконструктор просто не вписывается в дизайн языка.

Конструкторы не «возвращают» объекты, они инициализируют объекты в той области памяти, в которой они вызываются.Если вы объявляете объект типа класса со статической продолжительностью хранения (и этот тип имеет объявленный пользователем конструктор), память резервируется для времени жизни программы, и реализация гарантирует, что конструктор вызывается для инициализации объекта в этом местев соответствующее время в программе.

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

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

Обратите внимание, что если 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.
2 голосов
/ 22 апреля 2011

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

1 голос
/ 22 апреля 2011

Конструктор может выдавать только сам объект ...

0 голосов
/ 11 июля 2013

Конструктор не имеет типа retunrn, потому что он уже возвращает refrence_id в переменную refrence (которая вызывается как объект) для ex: - Emp e1 = new Emp (refrence_id) здесь Emp это имя_класса e1 это переменная refrence newиспользуется для динамического размещения. Emp () - конструктор класса Emp, в этом конструкторе возвращает refrence_id переменной refrence e1

...