[英]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.