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

Почему конструкторы не возвращают значения?

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

4b9b3361

Ответ 1

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

Это пространство включает в себя все переменные-члены и vtbl. После выделения этого пространства конструктор вызывается как внутренняя часть процесса создания и инициализации для инициализации содержимого полей.

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

Его возвращаемое значение (если оно действительно имеет его при компиляции до машинного кода) непрозрачно для пользователя, поэтому вы не можете его указать.

Ответ 2

Ну, в некотором роде он возвращает только что сконструированный экземпляр.

Вы даже называете это так, например, Java

 Object o = new Something();

который выглядит так же, как вызов "обычного" метода с возвращаемым значением

 Object o = someMethod();

Ответ 3

(Я склонен к С++, поэтому в отношении других языков возьмите это с солью.)

Краткий ответ: вы не хотите явно указывать на успех для каждой отдельной конструкции объекта в вашем коде.

Несколько больше ответа: в С++ конструкторы вызываются как динамически, так и глобально и автоматически распределенные объекты. В этом коде

void f()
{
  std::string s;
}

нет возможности для конструктора s (std::string::string()) вернуть любое значение. Либо он преуспевает - тогда мы можем использовать объект, или он выдает исключение - мы никогда не получим возможность попытаться его использовать.

ИМО, как и должно быть.

Ответ 4

Как конструктор должен возвращать возвращаемое значение? Оператор new возвращает вновь созданный экземпляр. Вы не называете ctor, new делает это.

MyClass instance = new MyClass();

Если ctor вернет значение, например:

public int MyClass()
{
    return 42;
}

Где бы вы получили целое число?

Ответ 5

Когда вы вызываете конструктор, возвращаемым значением является новый объект:

Point pt = new Point(1,2);

Но внутри самого конструктора вы фактически не создаете и не возвращаете объект; он был создан до запуска вашего кода, вы просто устанавливаете начальные значения.

Point::Point(int x, int y) {
  this->x = x;
  this->y = y;
}

Отсутствие типа возврата отражает тот факт, что конструкторы используются иначе, чем другие функции. Тип возврата null, хотя и технически точный, не отражает того факта, что код используется так, как если бы он возвращал объект. Однако любой другой тип возврата указывает, что ваш код должен return что-то в конце, что также неверно.

Ответ 6

Конструктор - это некоторый метод, автоматически вызываемый при инициализации нового экземпляра объекта.

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

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

Ответ 7

все ответы предвзяты к С++/Java. нет причин, по которым конструктор не возвращает значение, отличное от языка.

Посмотрите на конструктор в более широком смысле: это функция, которая создает новый объект. вы можете написать вполне допустимые конструкторы в C:

typedef struct object object;
int object_create( object **this );

это идеальный OOP в C, и конструктор возвращает значение (это также можно назвать factory, но имя зависит от намерения).

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


обсуждение шире, чем мы думаем. Объектно-ориентированное программирование - это имя, которое описывает способ мышления о программировании. вы можете иметь OO практически на любом языке: все, что вам нужно, это структуры и функции. такие основные языки, как С++ и Java, настолько распространены, что мы думаем, что они определяют "путь". теперь посмотрите на модель OO в Ada: она далека от модели С++, но все еще OO. Я уверен, что такие языки, как Lisp, имеют другие способы выполнения OO.

Ответ 8

Один вопрос, который еще не обсуждался, заключается в том, что конструктор класса "foo" должен использоваться не только при создании экземпляров foo, но и при создании экземпляров классов, полученных из foo. В отсутствие дженериков (которые не были доступны, когда были разработаны Java, С++ или .net), конструктор foo не мог бы возвращать объект любого производного класса. Поэтому необходимо, чтобы объект производного класса создавался с помощью некоторых других средств, а затем предоставлялся foo constructor (который затем сможет использовать рассматриваемый объект как foo при выполнении его инициализации).

Ответ 9

Несмотря на то, что реализация конструктора VM не должна возвращать какое-либо значение, на практике это как-то вроде новой ссылки на объект. Затем было бы синтаксически странно и/или запутывать возможность хранения одной или обеих новых ссылок на объекты и дополнительного возвращаемого значения в одном из операторов.

Ответ 10

Конструктор напрямую не вызывается кодом пользователя. Он вызывается путем выделения памяти и кода инициализации объекта во время выполнения. Его значение не отображается пользователю.

Ответ 11

В случае С# синтаксис объявления объекта:

classname objectname= new constructor();

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

Ответ 12

Мы не можем вызвать конструкторы независимо. Вместо этого они автоматически вызываются всякий раз, когда создаются объекты. Пример:

MyDate md = new Mydate(22,12,2012);

В приведенном выше примере new будет возвращено место памяти, которое будет удерживаться md, и программно мы не сможем возвращать несколько значений в одиночных операторах. Поэтому конструкторы ничего не могут вернуть.

Ответ 13

Из того, что я знаю о методологиях проектирования OO, я бы сказал следующее:

1) Разрешив конструктору вернуть значение, разработчик фреймворка позволит программе сбой в тот момент, когда возвращаемое значение не обрабатывается. Чтобы сохранить целостность рабочего процесса программы, нельзя разрешить возвращаемое значение из инициализации объекта. Вместо этого разработчик языка предложит/заставит кодировщиков использовать методы доступа getter/setter.

2) Разрешить возврату объекта при инициализации также открывает возможные утечки информации. Специально при наличии нескольких уровней или модификаций доступа, применяемых к переменным/методам.

Ответ 14

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

Class ABC
{
     int i;
public:
     int ABC()
     {
        i=0;
        return i;
     }
     .......
};
int main()
{
    int k= ABC abc; //constructor is called so we have to store the value return by it
    ....
}

Но поскольку вы знаете, что stament как int k= ABC abc; невозможно на любом языке программирования. Надеюсь, вы сможете понять.

Ответ 15

Я нашел его полезным

Эта путаница возникает из предположения, что конструкторы подобны любым другим функциям/методам, определенным классом. НЕТ, они не являются.

Конструкторы - это лишь часть процесса создания объекта. Они не называются как другие функции-члены.

Ответ 16

Я бы использовал Java в качестве своего языка в ответе.

class SayHelloOnCreation {
     public SayHelloOnCreation() {
         System.out.println("Hello, Thanks For Creating me!");
     }
}

class Test {
     public static void main(String[]args) { 
         SayHelloOnCreation thing = new SayHelloOnCreation(); //This line here, produces an output - Hello, Thanks For Creating me!
     }
}

Теперь посмотрим, что здесь происходит. в java мы используем ключевое слово new, чтобы создать экземпляр класса. И, как вы можете видеть в коде, в строке SayHelloOnCreation thing = new SayHelloOnCreation();, выражение после выполнения оператора присваивания выполняется до того, как выполняется назначение. Поэтому, используя ключевое слово new, мы вызываем конструктор этого класса (SayHelloOnCreation()), и этот конструктор создает объект в куче Java. После создания объекта ссылка на этот объект присваивается ссылке вещь типа SayHelloOnCreation.

Точка, которую я пытаюсь сохранить здесь, заключается в том, что если конструкторам разрешен иметь тип возвращаемого значения, Firstly, будет сильно скомпрометирован строго типизированный характер языка ( Помните, что я говорю о Java здесь).

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

Ответ 17

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

Ответ 18

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

Так почему конструктор не возвращает никакого значения

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

Так почему же он даже не возвращает Void

Это на самом деле ограничение Design, которое было установлено, чтобы отличать его от методов. public void className() совершенно допустим в Java, но он обозначает метод, а не конструктор. Чтобы компилятор понял, что это конструктор, ему нужен способ его различения.