静态分配的构造函数和析构函数顺序

时间:2016-09-08 16:15:59

标签: c++ c++11 constructor

我写了这个简单的代码,我期待不同的结果。

struct Test {
  int value_;
  Test(): value_(0) {
    std::cout << "Constructor: "<< value_ << "\n";
  }

  Test(int value): value_(value) {
    std::cout << "Constructor: "<< value_ << "\n";
  }

  ~Test() {
    std::cout << "Destructor: "<< value_ << "\n";
  }
};

int main(int argc, char **argv) {
  Test t;
  t = Test(10);
  t = Test(15);
  t = Test(20);
  t = Test(25);
}

结果:

Constructor: 0
Constructor: 10
Destructor: 10
Constructor: 15
Destructor: 15
Constructor: 20
Destructor: 20
Constructor: 25
Destructor: 25
Destructor: 25

我很惊讶,因为它没想到最后一行会重复。为什么没有调用Destructor: 0

2 个答案:

答案 0 :(得分:5)

第一个&#34;析构函数:25&#34;来自Test(25)创建的临时对象的破坏;第二个是来自被复制的t的破坏。

除了最后一个&#34;析构函数:&#34; line和第一个&#34;构造函数:&#34;,所有输出都来自这些临时对象的创建和销毁。没有&#34;析构函数:0&#34;因为你永远不会创建一个值为0的临时对象,并且当t被销毁时,它的值不再是0。

答案 1 :(得分:1)

这些行中的第一行对应于临时对象的销毁。

这些行中的第二行对应于t的破坏。

t被破坏后,value_25,因为您使用了

t = Test(25);

main中的最后一行。