2015-11-10 4 views
0

Рассмотрим следующую программу:Можно ли создать объект внутри конструктора класса?

#include <iostream> 
struct T 
{ 
    public: 
     T() : b(6) 
     { 
      T t=*this; // copy constructor 
      std::cout<<t; 
     } 
     int b; 
     friend std::ostream& operator<<(std::ostream&,const T& t); 
}t; 
std::ostream& operator<<(std::ostream& o,const T& t) 
{ 
    o<<t.b<<'\n'; 
    return o; 
} 
int main() { } 

выше программа выглядит странно для меня на самом деле. Можно ли создать объект класса внутри конструктора? Четко ли определено поведение этого кода?

+1

Хотя технически обоснованно, это плохая идея. Пожалуйста, прочитайте: ** [Если вы используете этот указатель в конструкторе?] (Https://isocpp.org/wiki/faq/ctors#using-this-inctors) ** –

+1

Объект не считается построенный до завершения конструктора. Я не уверен, что это использование '* this' верно –

+0

@ M.M: почему http://ideone.com/BsIm3G эта программа приводит к ошибке выполнения. Когда я компилирую и запускаю его на моей локальной машине в g ++ 4.8.1, во время выполнения я получил сообщение об ошибке, которое test.exe перестало работать. Зачем? какова причина? – Destructor

ответ

2

Да, это четко определено. Он будет использовать конструктор копирования, и объект разрушается, когда тело конструктора заканчивается.

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

+0

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

+0

@PravasiMeet, что было бы вопросом спросить о переполнении стека. –

2

Это нормально, если вы случайно не вызываете тот же конструктор рекурсивно! Я видел много программ для студентов, которые сделали именно это, обычно при попытке реализовать связанный список.

+3

Повторный ввод одного и того же конструктора на разные объекты не обязательно является проблемой. Рекурсия без прерывания. –

+2

Действительно, пока есть базовый корпус. Видно много кода студента, где первая строка конструктора создает экземпляр того же класса с тем же конструктором безоговорочно. –

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