繁体   English   中英

C++中对象的生命周期

[英]Lifetime of objects in c++

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();
}

输出:

构造器!

构造器!

已复制!

破坏者!

破坏者!

破坏者!


我创建了两个对象,然后复制了一个,所以三个构造函数和三个析构函数。

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

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

另请注意,如果您打开优化,您可能只看到两个构造函数和两个析构函数,而不会发生复制构造。 使用足够新的 (C++17) 编译器,即使您不打开优化(复制省略已成为强制性),也应该发生这种情况。

这是一个微不足道的问题

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

你打电话时

o=hi();

您的函数被调用,它生成一个 Entity 类型的对象,它反过来调用构造函数。 这是您获得一条额外构造函数消息的地方

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM