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

Открытие сокетов в Python довольно просто. Вам действительно просто нужно что-то вроде этого:

import socket
sock = socket.socket()
sock.connect((address, port))

и затем Вы можете send() и recv() как любой другой сокет

80
задан asthasr 30 September 2013 в 14:17
поделиться

7 ответов

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

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

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

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

104
ответ дан 24 November 2019 в 09:58
поделиться

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

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

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

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

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


обсуждение шире, чем мы думаем. Объектно-ориентированное программирование - это имя, которое описывает способ мышления о программировании. ОО можно использовать практически на любом языке: все, что вам нужно, это структуры и функции. основные языки, такие как C ++ и Java, настолько распространены, что мы думаем, что они определяют «путь». Теперь посмотрим на объектно-ориентированную модель в Ada: она далека от модели C ++, но все еще остается объектно-ориентированной. я уверен, что у таких языков, как Lisp, есть и другие способы объектно-ориентированного программирования.

1
ответ дан 24 November 2019 в 09:58
поделиться

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

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

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

1
ответ дан 24 November 2019 в 09:58
поделиться

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

Point pt = new Point(1,2);

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

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

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

2
ответ дан 24 November 2019 в 09:58
поделиться

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

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

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

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

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

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

4
ответ дан 24 November 2019 в 09:58
поделиться

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

MyClass instance = new MyClass();

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

public int MyClass()
{
    return 42;
}

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

3
ответ дан 24 November 2019 в 09:58
поделиться

В каком-то смысле он возвращает только что созданный экземпляр.

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

 Object o = new Something();

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

 Object o = someMethod();
12
ответ дан 24 November 2019 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: