为什么在传递给函数而不是构造函数时调用析构函数?

问题描述 投票:0回答:2

让我们看一下这段代码。为什么析构函数的数目比构造函数要多?

#include <iostream>
using namespace std;


class B{

    public:
    B(){
        cout << "constructor of B\n";
    }
    ~B(){
        cout << "destructor of B\n";
    }
};


void func(B obj){
}


int main(){
    B obj;
    func(obj);
}

输出为

constructor of B
destructor of B
destructor of B

我不明白为什么调用的析构函数的数量与调用的析构函数的数量不同?

c++ oop constructor destructor
2个回答
0
投票

您正在按值将对象传递给函数。因此,将复制对象,从而导致调用对象的副本构造函数。当函数结束执行时,将破坏参数的临时副本,从而调用析构函数。


0
投票

只需更改函数func()的签名将有助于您了解某些真正缺失的东西。考虑这一点:

void func(B & obj) { ... }

在这里,您将通过引用使用该对象,并且由于直接操作该类函数并且不会调用任何临时复制的参数,因此您将不再收到两个析构函数消息。

然后您应该得到类似以下输出的内容:

construct of B
destructor of B
© www.soinside.com 2019 - 2024. All rights reserved.