为什么只有静态成员可以访问私有析构函数?

时间:2021-05-03 07:46:30

标签: c++

#include <iostream>
using namespace std;

class MonsterDB
{
private:
    ~MonsterDB() {}; //private destructor
public:
    static void DestroyInstance(MonsterDB* pInstance)
    {
        //static member can access private destructor
        delete pInstance;
    }
    //...other methods
};
int main()
{
    // instantiation in heap
    MonsterDB* pMyDatabase = new MonsterDB();

    MonsterDB::DestroyInstance(pMyDatabase);
    
    return 0;
}

伙计们,为什么只有静态成员才能访问私有析构函数?

当我从中删除静态时:

static void DestroyInstance(MonsterDB* pInstance)

出现错误!

我问这个问题的原因是:

#include <iostream>
using namespace std;

class MonsterDB
{
private:
    int variable;

    
    
public:
    void printer()
    {
        cout<<variable<<endl;
    }
    void instancer(int s)
    {
        variable = s;
    }
    
    //...other methods
};

int main()
{
    MonsterDB obj1;
    int var = 5;
    obj1.instancer(var);
    obj1.printer();
}

在我制作的上述代码中,两个函数:printer 和 instancer 都访问了私有变量,而无需在这些函数中指定 static 关键字。

抱歉耽误您的时间,提前谢谢!希望在这背后给出真正的直觉。

1 个答案:

答案 0 :(得分:1)

您可能还记得,static(在此上下文中)表示该函数的行为类似于全局函数,这意味着它绑定到该类的单个实例。 >

MonsterDB::DestroyInstance(pMyDatabase);

显然,如果 DestroyInstance 不是 static,此行将始终失败(并且与私有析构函数无关)。这样称呼

pMyDatabase->DestroyInstance(pMyDatabase);

即使方法不是静态的也能工作(虽然很别扭,但把这个方法设为静态更有意义)。

相关问题