首页 > 解决方案 > 为什么我调用构造函数和析构函数的顺序很奇怪

问题描述

我正在研究构造函数和析构函数的调用顺序,我编写了该代码:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

class Corgi {

    private:
        string nickname;

    public:
        Corgi(): nickname("unknown") {
            cout << "Corgi object CREATED. Name: unknown" << endl;
        }
        Corgi(const string& _nickname): nickname(_nickname) {
            cout << "Corgi object CREATED.   \tName: " + nickname << endl;
        }
        string getName() { return nickname; }
        ~Corgi() { cout << "Corgi object DESTROYED. \tName: " << nickname << endl; }
};

int main() {
vector<Corgi> zoo;
    for (int i = 0; i < 5; i++)
        zoo.push_back(Corgi("Zoo Corgi_" + to_string(i)));

    return 0;
}

我得到的输出

Corgi object CREATED.       Name: Zoo Corgi_0
Corgi object DESTROYED.     Name: Zoo Corgi_0
Corgi object CREATED.       Name: Zoo Corgi_1
Corgi object DESTROYED.     Name: Zoo Corgi_0
Corgi object DESTROYED.     Name: Zoo Corgi_1
Corgi object CREATED.       Name: Zoo Corgi_2
Corgi object DESTROYED.     Name: Zoo Corgi_0
Corgi object DESTROYED.     Name: Zoo Corgi_1
Corgi object DESTROYED.     Name: Zoo Corgi_2
Corgi object CREATED.       Name: Zoo Corgi_3
Corgi object DESTROYED.     Name: Zoo Corgi_3
Corgi object CREATED.       Name: Zoo Corgi_4
Corgi object DESTROYED.     Name: Zoo Corgi_0
Corgi object DESTROYED.     Name: Zoo Corgi_1
Corgi object DESTROYED.     Name: Zoo Corgi_2
Corgi object DESTROYED.     Name: Zoo Corgi_3
Corgi object DESTROYED.     Name: Zoo Corgi_4
Corgi object DESTROYED.     Name: Zoo Corgi_0
Corgi object DESTROYED.     Name: Zoo Corgi_1
Corgi object DESTROYED.     Name: Zoo Corgi_2
Corgi object DESTROYED.     Name: Zoo Corgi_3
Corgi object DESTROYED.     Name: Zoo Corgi_4

这个输出让我完全困惑。

在输出中,我预计有 10 行:5 行用于从 0 到 4 创建 Zoo Corgis,5 行用于破坏这些对象。但显然事情要复杂得多。

我很感激任何帮助。

标签: c++constructordestructor

解决方案


推荐阅读