簡體   English   中英

為什么析構函數和復制構造函數使用對象數組顯示此行為?

[英]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};

obj1obj2不是臨時的,因此在這種情況下必須出現真實副本。

在:

Check b[2] = {Check(5),Check(4)};

此語法意味着兩個數組元素的構造函數參數為54 這並不意味着參數是臨時的。

Check(5)是一個prvalue表達式 ,這不一定表示一個臨時實例 可以使用prvalue的一種方式是將其用作同一類型對象的初始化程序。

在C ++ 17中,此行為已更改; 在此之前,概念上總是有一個臨時文件,但是可以由編譯器自行決定是否刪除該臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM