首页 > 解决方案 > 析构函数如何在一个简单的程序中工作?

问题描述

我不明白这个程序的输出:

class A {
public :
    A()  { cout << "A()"  << endl; }
    ~A() { cout << "~A()" << endl; }
};

A f (A & a) { 
    return a;
}

int main() {
    A a ;
    a = f(a);

    return 0;
}

我期望

A()
~A()

因为我只创建了一个A对象:a。但是,输出是

A()
~A()
~A()

你知道这是为什么吗?


后续问题

好的,所以每当调用 时f,我都会构造 an 的副本A,所以我有 1 次调用复制构造函数和 1 次调用析构函数...

现在说我的主要功能是:

int main() {
    A a ;
    A b = f(a);
    cout << "returning 0" << endl;
    return 0;
}

我希望输出是

A(),
A(const A &) (for using f(a))
~A()         (for deleting temporary f(a))
returning 0
~A()         (destroying B)
~A()         (destroying A)

但输出是

A() 
A(const& A) 
returning 0
~A()
~A()

这是为什么 ?

标签: c++constructordestructor

解决方案


您只显式创建了一个对象,但您在这里创建了一个对象:

A f (A & a) { return a ;} //when returning A

当您复制对象以将其从 f 传回时,该副本是由默认的复制构造函数构造的,因为您没有提供一个。如果您将班级更改为:

class A {
public :
    A () { cout << "A() " << endl;}
    A (const A &) { cout << "A(const &) " << endl;}
    ~A () { cout << "~A ()" << endl; }
};

您将看到复制构造函数被调用(正如您提供的那样)。


推荐阅读