据我所知,调用析构函数的顺序与创建对象的顺序相反。
然而,在下面的代码中,我不明白为什么 C(1) 和 C(2) 的析构函数在其构造函数之后立即被调用。
另外,语句 C(2) 和 C c3(3) 之间有什么区别。第二个是一个用值 3 初始化的对象。C(2) 的解释是什么?
#include <iostream>
class C {
public:
C(int i)
{ j = i;
std::cout << "constructor called for "<<j << std::endl;;
}
~C()
{ std::cout << "destructor called for "<<j<< std::endl;; }
private:
int j;
};
int main() {
C(1);
C(2);
C c3(3);
C c4(4);
}
Run Code Online (Sandbox Code Playgroud)
代码的输出是:
constructor called for 1
destructor called for 1
constructor called for 2
destructor called for 2
constructor called for 3
constructor called for 4
destructor called for 4
destructor called for 3
Run Code Online (Sandbox Code Playgroud)
C(1);
C
是一个包含表达式的语句,该表达式创建从参数构造的临时类型1
。临时对象没有命名 - 没有变量名,并且在语句执行完成后无法引用该对象 - 因此临时对象的析构函数在语句之后立即运行。
这与 形成鲜明对比C c3(3);
,后者是名为 的变量的变量定义c3
。它保留在范围内,直到封闭范围(在本例中为函数范围)结束。因此,c4
构造函数和析构函数在 的析构函数之前运行c3
。