C ++:外部类中的静态内部类实例的构造和销毁

时间:2020-06-13 15:41:28

标签: 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之前应该有一个destruct Inner,在destruct Inner之后应该是destruct Outter。有人可以解释这里发生的事情吗?

1 个答案:

答案 0 :(得分:0)

由于您调用Inner i;时已经构建了get,所以输出与您期望的不一样。

将发生以下情况: 1.在get中,您将静态实例复制到i,这是一个复制操作,此处没有默认构造。 3.您返回临时复制的 Inner对象,该对象立即被破坏,因此destruct Inner

我想Outer是不言而喻的。您对其进行了构造,当它超出范围时就会被破坏。