2015-04-14 3 views
1

У меня возникли некоторые проблемы с пониманием типа возвращаемых конструкторов, мой профессор сказал, чтоC++ конструктор неявных Возвращаемого типа

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

Однако он неявно возвращает указатель (что означает, что вы не можете изменить поведение). Как побочная заметка, он возвращает указатель «this». Все это из руки программиста.

Является ли это высказыванием при создании объекта, который конструктор передает указатель, или я полностью здесь?

+3

Ваш профессор ошибочен, конструктор имеет неявный параметр 'this', который передается, но с точки зрения компилятора return будет' void' – Mgetz

+4

Конструктор всегда должен давать полезное значение типа класса.Таким образом, он не «возвращает» ничего, потому что «результат» его вызова всегда является вновь созданным объектом (а не указателем!) - это совершенно неправильно). Поскольку это задано спецификацией, это действительно выходит из рук программиста. – Jon

+1

Насколько я могу судить, это бессмысленно. Я подозреваю, что он говорит о 'new foo;', но не все вызовы конструктора включают 'new'. – Wintermute

ответ

2

Если мы называем это «инициализатором», а не «конструктором», это сделает его более понятным?

Конструктор фактически не создает объект. Он инициализирует объект.

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

+0

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

0

Есть два перспективных для поиска конструктора, часто обсуждения о них путают двух, вызывающих затруднение для ссылки. (Обратите внимание, что я собираюсь замаскировать определение vs ниже и рассматривать их как одну вещь, чтобы упростить сравнение)

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

Существует две причины, по которым конструкторы не имеют типа возврата типа void. Во-первых, это метод с тем же именем, что и класс, который должен быть определен, поскольку сайт вызова недвусмыслен, а отсутствие типа возврата делает определение однозначным. Во-вторых, чтобы избежать путаницы на сайте вызова в отношении возвращаемого типа, new Foo() «возвращает» Foo*, который не является void.

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

1

Конструкторы не имеют типов возврата, потому что они не являются функциями. Это похоже на вопрос о том, какой тип возврата int i; Это не имеет смысла, int i не является выражением, и ни один из них не является Foo f;.

Это может помочь узнать, что такое C-эквивалентность конструктора.

Рассмотрим следующий код C++ ...

class Foo { 
    public: 
    Foo(int i) : m_i(i) 
    { 
    } 

    private: 
    int m_i; 
}; 

int main (void) 
{ 
    Foo f(5); 

    return 0; 
} 

В C, мы реализовали то же самое ...

typedef struct Foo { 
    int m_i; 
} Foo_t; 

Foo_init (Foo_t * self, int i) 
{ 
    self->m_i = i; 
} 

int main (void) 
{ 
    Foo_t f; // This is the "Constructor" in C 
    Foo_init(&f, 5); // Which is decorated with this logic. 

    return 0; 
} 

Why do constructors not return values? (спасибо @tivn) рекомендуется читать для этого ,

Смежные вопросы