所以我有一些C ++代码:
#include <iostream>
using namespace std;
class C {
public:
C() {i = 9; cout << "C0:" << i << endl;}
C(int i0) {i = i0; cout << "C1:" << i << endl;}
~C() {cout << "C2:" << i << endl;}
private:
int i;
};
void f(int i) {
C c(i);
}
int main(int argc, char* argv[]) {
for (int i = 0; i < 1; i++) {
cout << "X" << endl;
f(i);
cout << "Y" << endl;
}
}
输出是:
X
C1:0
C2:0
Y
这很奇怪,因为C2:0行是析构函数的一部分,我学到的是在最后一个语句之后调用的。所以我的问题是在最后一个陈述之前调用析构函的情况是什么?
答案 0 :(得分:1)
在函数f中创建对象C
。因此,当C
函数范围结束时,f
被销毁,只需在main中调用f(i)
,f
范围被销毁,以及C
对象的析构函数被称为。
答案 1 :(得分:0)
当他们所在的堆栈消失时,自动变量(c
中的f()
)会被清除。
因此,在这种情况下,您的f(i)
来电正在返回。对于对象,这包括调用析构函数。
当程序退出时,全局和静态变量也会在它正常退出时清除。如果它通过未捕获的异常退出,则可能无法清除它们(不需要)。
答案 2 :(得分:0)
这很奇怪,因为C2:0行是析构函数的一部分,我学到的是在最后一个语句之后调用的。
在包含变量的范围的最后一个语句之后调用析构函数。该变量是类的实例。
答案 3 :(得分:0)
C
在f(int i)
函数的范围内创建和销毁,因此C的析构函数打印&#34; C2:0&#34;。 f完成,然后才打印Y.