c++ - C++:外部类中静态内部类实例的构造和销毁
问题描述
我是 C++ 新手,正在学习 C++ 的嵌套类和静态类成员,我编写了以下代码:
#include <iostream>
using namespace std;
class Outter
{
public:
Outter() {
//get();
cout << "construct Outter" << endl;
}
~Outter() {
cout << "destruct Outter" << endl;
}
private:
class Inner
{
public:
Inner() {
cout << "construct Inner" << endl;
}
~Inner() {
cout << "destruct Inner" << endl;
}
};
//Inner get() {
// return i;
//}
static Inner i;
};
int main() {
Outter o;
return 0;
}
我在外部类中创建了一个内部类和一个内部类的静态实例。当我在没有get()
函数的情况下运行此代码时,结果输出为:
construct Outter
destruct Outter
然后我删除get()
函数的注释并调用它Outter()
,我重新运行程序,输出变为:
destruct Inner
construct Outter
destruct Outter
我对这个结果感到困惑,因为据我所知,应该有一个construct Inner
beforedestruct Inner
和destruct Inner
should after destruct Outter
。有人可以解释这里发生了什么吗?
解决方案
输出与您预期的不一样,因为Inner i;
在您调用get
.
发生的情况如下: 1. 在get
你得到一个静态实例 to i
,这是一个复制操作,这里没有默认构造。3. 您返回一个临时复制 Inner
的对象,该对象立即被破坏,因此destruct Inner
.
,Outer
我想,是不言而喻的。你构建它,当它超出范围时它被破坏。
推荐阅读
- xamarin.forms - How to open a page from App.xaml.cs if not open already
- javascript - 用于面试时隙可用性的 MongoDB Schema
- python - 在 Python 中从 xarray 数据集创建栅格堆栈
- javascript - 在 React.js 中点击动画表单提交通知
- dataweave - 需要帮助在 mulesoft 中使用 dataweaver 为数组中的子行项目组构建标题项目(即时)
- c# - 将 StreamWriter 用于日志文件的正确方法
- c++ - 使用 emscripten 编译时 GL_LINE_SMOOTH 未声明的标识符
- dart - 带有订阅的 dart HttpClient 导致延迟关闭
- jquery - 试图用纯 js fetch 重写 jquery ajax。获取身体
- android - 如何获取使用 drawText() 创建的文本的 X 和 Y 坐标?