簡體   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