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

标签 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 没有被调用?

最佳答案

第一个“Destructor: 25”来自Test(25)创建的临时对象的析构;第二个是来自 t 的销毁,它已被复制到其中。

除了最后的“Destructor:”行和第一个“Constructor:”之外,所有输出都来自这些临时对象的创建和销毁。没有“Destructor: 0”,因为您永远不会创建值为 0 的临时对象,并且当 t 被销毁时,它的值不再是 0。

关于c++ - 静态分配的构造函数和析构函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395853/

相关文章:

C++ 在数组中查找一个整数

c++ - 隐式定义与显式声明的构造函数

c++ - temporary的析构函数什么时候调用

java - 我需要帮助创建实例变量和构造函数

c++ - std::unique_lock<mutex> 和 conditional_variable cond 的关系

c++ - 有人可以解释这个 C++ 程序的输出吗?

c++ - 如何使用 QtConcurrent 对 QByteArray 进行 qCompress?

android - 在 Android 中手动设置上下文

c++ - C++ 标准是否允许使用 typedef 重命名构造函数?

c++ - 共享库符号名称