Время жизни объектов в с ++ - PullRequest
0 голосов
/ 10 марта 2019
class Entity
{
  public:
    int a;
    Entity(int t)
      :a(t)
    {
        std::cout << "Constructor !" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Destructor !" << std::endl;
    }

    Entity(Entity& o)
    {
        std::cout << "Copied !" << std::endl;
        this->a = o.a;
    }
};

Entity hi()
{
    Entity oi(3);
   return oi;
} 

int main()
{
  {
        Entity o(1);
        o = hi();
  }
     std::cin.get();
}

ВЫХОД:

Конструктор!

Конструктор!

Скопировано!

Деструктор!

Деструктор!

Разрушитель!


Я создал два объекта, поэтому два конструктора.Тогда почему существует 3 деструктора?

Может ли кто-нибудь объяснить причину трех деструкторов?

Спасибо за продвижение.

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Ваше "Скопировано!"строка в выводе исходит из конструктора копирования, поэтому вы создаете три объекта, а не два (тогда вы уничтожаете все три, как и ожидалось).

Обратите внимание, что конструктор копирования обычно должен принимать егоаргумент const ссылка.Возможно, вы используете компилятор Microsoft C ++, который привязывает временную ссылку к неконстантной ссылке.

Также обратите внимание, что если вы включите оптимизацию, вы, вероятно, сможете увидеть только два конструктора и двадеструкторы, без копирования конструкции не происходит.С достаточно новым (C ++ 17) компилятором это должно произойти, даже если вы не включаете оптимизацию (удаление копии стало обязательным).

1 голос
/ 10 марта 2019

Это тривиальный вопрос

Может ли кто-нибудь объяснить причину трех деструкторов?

при звонке

o=hi();

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

Замените свой Entity(int t) contructor by this

 Entity(int t)
   :a(t)
  {
    std::cout << "Constructor created with integer "<< a << std::endl;
  }

Вы увидите, какие конструкторы были вызваны при запуске кода.

...