[英]Why destructor and copy constructor is showing this behavior with array of objects?
當使用匿名對象初始化數組時,析構函數顯示有效值,但是我創建了一個包含對象的數組,重寫副本構造函數不會調用,析構函數也會顯示垃圾值。
我試圖通過顯示值來理解這一點,但仍然感到困惑。
class Check{
private:
int a;
public:
Check()
{
this->a = 9999;
cout << "\n Default Constructor Called \n";
}
Check(int i)
{
this->a = i;
}
Check(const Check & obj)
{
cout << "COPY CONSTRUCTOR\n";
}
~Check()
{
cout << this->a<<" DESTRUCTOR \n";
}
};
Check b[2] = {Check(5),Check(4)};
Check obj1(2);
Check obj2(3);
Check a[2] = {obj1,obj2};
我期待“ COPY CONSTRUCTOR”輸出4倍,但它只有2倍,沒有垃圾值。 實際輸出如下所示:
COPY CONSTRUCTOR COPY CONSTRUCTOR 32649 DESTRUCTOR -1330935392 DESTRUCTOR 3 DESTRUCTOR 2 DESTRUCTOR 4 DESTRUCTOR 5 DESTRUCTOR
原因是由於復制省略。
在這種情況下:
Check b[2] = {Check(5),Check(4)};
由於這兩個值都是臨時值,因此允許編譯器(或在C ++ 17中為強制執行)優化副本,然后就地構造對象。
但是,在第二種情況下:
Check a[2] = {obj1,obj2};
obj1
和obj2
不是臨時的,因此在這種情況下必須出現真實副本。
在:
Check b[2] = {Check(5),Check(4)};
此語法意味着兩個數組元素的構造函數參數為5
和4
。 這並不意味着參數是臨時的。
Check(5)
是一個prvalue表達式 ,這不一定表示一個臨時實例 。 可以使用prvalue的一種方式是將其用作同一類型對象的初始化程序。
在C ++ 17中,此行為已更改; 在此之前,概念上總是有一個臨時文件,但是可以由編譯器自行決定是否刪除該臨時文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.