Что возвращает конструктор? - PullRequest
10 голосов
/ 23 ноября 2010

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

struct empty{};

int main(){
   empty(); //creates a temporary and implicitly a constructor is called
}

Таким образом, согласно моей интерпретации, неявный тип возврата должен быть именем класса, в данном случае empty. Правильна ли моя дикая интерпретация?

Ответы [ 6 ]

30 голосов
/ 23 ноября 2010

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

В приведенном вами примере empty() не является выражением вызова функции, это инициализация значения.Он создает инициализированный значением временный объект типа empty.

7 голосов
/ 31 декабря 2012

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

*this;

Как это используется?

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

4 голосов
/ 23 ноября 2010

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

1 голос
/ 11 апреля 2017

Конструктор ничего не возвращает.

Источник путаницы:

Book *b = new Book();

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

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

0 голосов
/ 22 мая 2014

что по этому поводу:

int main() {
const empty &er = empty();
empty *ep = const_cast<empty*>(er); //casting away conentness to make changes in the members
cout<<"\n main ends \n";
//dtor get called here
}

ctor возвращает константную ссылку на ячейку памяти (* this), вы можете отбросить const и использовать его в качестве неконстантного нормального объекта, например empty *e = new e;

0 голосов
/ 23 ноября 2010

В C ++, если я правильно помню, ваш код выделит достаточно места для «пустого» стека, а затем вызовет конструктор по умолчанию empty - как указано в () - неявно передавая ему ссылку this.Там нет возврата.А в вашем случае нет конструктора.

...