为什么析构函数执行两次?

问题描述 投票:1回答:1

这是我的Car.class

#include <iostream>
using namespace std;

class Car
{
public:
    ~Car()  { cout << "Car is destructed." << endl; }
};

class Taxi :public Car
{
public:
    ~Taxi() {cout << "Taxi is destructed." << endl; }
};

void test(Car c) {}

int main()
{
    Taxi taxi;
    test(taxi);
    return 0;
}

这是输出

Car is destructed.
Car is destructed.
Taxi is destructed.
Car is destructed.

test(Car c)函数使用值作为形式参数。转到该功能时会复制汽车。因此,我认为离开该功能时只会有一辆“汽车被毁”。但是实际上在离开函数时有两个“汽车被破坏”。(输出中显示的第一行和第二行)为什么会有两个“汽车被毁”?谢谢。

c++ destructor
1个回答
0
投票

[创建Taxi时,还创建了Car子对象。当出租车被摧毁时,两个物体都被破坏了。

调用test()时,将按值传递Car。因此,第二辆汽车将被复制并在离开测试时被破坏。

我们有3个析构函数的解释。

我无法复制第四个。但这可能是临时的Car,例如对于返回值(如果它是Car test(Car)而不是void test(Car)),或者对于从TaxiCar的转换,如果您的编译器不执行复制省略。

[请注意,您在此处执行object slicing,在致电测试时丢失了汽车的出租车部分。为避免这种情况,您可以考虑通过引用传递。

© www.soinside.com 2019 - 2024. All rights reserved.