c++ - 为什么我调用构造函数和析构函数的顺序很奇怪
问题描述
我正在研究构造函数和析构函数的调用顺序,我编写了该代码:
#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
这个输出让我完全困惑。
- 如果 Zoo Corgi_0 只创建一次,为什么它会被销毁 5 次?
- 为什么 Zoo Corgi_0 在 Zoo Corgi_1 被创建之前就被创建并立即销毁?
- 是什么让 C++ 在创建 Zoo Corgi_1 后再次破坏 Zoo Corgi_0?
在输出中,我预计有 10 行:5 行用于从 0 到 4 创建 Zoo Corgis,5 行用于破坏这些对象。但显然事情要复杂得多。
我很感激任何帮助。
解决方案
推荐阅读
- amazon-web-services - 从 docker 容器(Spring Boot 应用程序)托管的 Amazon AWS ECS 集群以编程方式发送电子邮件的最佳方式?
- varnish - Varnish 不对不经常请求的缓存进行原始调用
- php - 我得到了 API 控制器的新功能,但它在这方面不起作用
- c++ - 突然之间,我的 Qt 应用程序显示为 100% 而不是正常的 200%,我做了什么更改使其失去了该功能?
- django - 当我通过链接到启用站点的目录启用文件时出现 Nginx 问题
- node.js - 在这种情况下我们应该使用 Promise.all 吗?内容细节
- python - TimeDistributed 层,但权重不同
- php - 如何将简码插入现有的 html 元素(wordpress)?
- nginx - 了解 nginx 地理模块指令
- java - 创建实体表后休眠可以初始化数据吗?