C++ 构造函数析构函数执行顺序差异

use*_*665 0 c++ destructor

据我所知,调用析构函数的顺序与创建对象的顺序相反。

然而,在下面的代码中,我不明白为什么 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)

Ton*_*roy 8

C(1);C是一个包含表达式的语句,该表达式创建从参数构造的临时类型1。临时对象没有命名 - 没有变量名,并且在语句执行完成后无法引用该对象 - 因此临时对象的析构函数在语句之后立即运行。

这与 形成鲜明对比C c3(3);,后者是名为 的变量的变量定义c3。它保留在范围内,直到封闭范围(在本例中为函数范围)结束。因此,c4构造函数和析构函数在 的析构函数之前运行c3