这些析构函数调用背后的逻辑是什么?

时间:2015-05-30 09:55:51

标签: c++ c++11

我运行了以下代码

#include <iostream>
using namespace std;

class Count
{
    private:

        int count;      

    public:

        //Constructor
        Count():count(0) { cout << "Constructor called" << endl; }

        //Destructor
        ~Count() { cout << "Destructor called" << endl; }

        //Display the value.
         Count display() 
         { 
               cout << "The value of count is " << count << endl; 
               return *this;
         }

};

int main()
{
    Count C;
    C.display();
}

结果: -

Constructor called
The value of count is 0
Destructor called
Destructor called

在上面的例子中,析构函数被调用两次,一次用于销毁&#34;这个&#34;对象和一个从main返回。

我的观察是否正确?

任何人都可以解释我在这个过程中创建的临时对象,如果它被创建,如果创建?

4 个答案:

答案 0 :(得分:3)

您正在从display()方法返回副本,因此它也需要被破坏。所以,在你的主体中你实际上有两个对象,一个 - 隐含地。

答案 1 :(得分:1)

析构函数被调用两次,因为display函数返回调用它的Count实例的副本。因此,C内的main实例会将其销毁。

2个实例= 2个析构函数调用。

如果指定并实现函数以返回Count的实例,那么它将执行此操作。如果您不想要此行为,请将返回类型更改为无效并且不返回任何内容 - 那么您的代码将只包含一个实例C

答案 2 :(得分:0)

您的代码

    Count display()  { 
 // ^^^^^
             cout << "The value of count is " << count << endl; 
             return *this; // <<<<<<
    } 

创建一个返回并立即销毁的实例的隐式副本,因此第二个析构函数调用。

答案 3 :(得分:0)

是的。

您的函数display()创建了一个副本,它创建了第二个对象。

如果您返回reference,则无法获得副本。

Count& display() { return *this; }