C ++中对象的生命周期

时间:2019-03-10 17:28:16

标签: c++ constructor destructor object-lifetime

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 个答案:

答案 0 :(得分:2)

您的“已复制!”输出中的一行来自复制构造函数,因此您要创建三个对象,而不仅仅是两个对象(然后按预期销毁所有三个对象)。

请注意,复制构造函数通常应通过const引用接受其参数。可能您正在使用Microsoft的C ++编译器,它将临时文件绑定到非const引用。

还请注意,如果启用优化,则可能希望看到仅两个构造函数和两个析构函数,而不会进行复制构造。使用足够新的(C ++ 17)编译器,即使不启用优化(复制省略已成为必需),也应会发生这种情况。

答案 1 :(得分:1)

这是一个琐碎的问题

有人可以解释三个析构函数的原因吗?

致电时

o=hi();

将调用您的函数,该函数将创建一个Entity类型的对象,该对象随后将调用构造函数。 这是您获得一条额外的构造函数消息的地方

替换您的Entity(int t) contructor by this

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

运行代码时,您将看到调用了哪些构造函数。