📜  私人破坏者

📅  最后修改于: 2021-05-25 22:49:01             🧑  作者: Mango

另请阅读:构造函数可以在C++中私有吗?
预测以下程序的输出。

// CPP program to illustrate 
// Private Destructor
#include 
using namespace std;
  
class Test {
private:
    ~Test() {}
};
int main()
{
}

上面的程序可以编译并正常运行。因此,我们可以这样说:创建私有析构函数并不是编译器错误。

现在,您对下面的程序怎么说?

// CPP program to illustrate 
// Private Destructor
#include 
using namespace std;
  
class Test {
private:
    ~Test() {}
};
int main()
{
    Test t;
}

上面的程序编译失败。编译器注意到,因为析构函数是私有的,所以无法破坏局部变量“ t”。
现在,下面的程序呢?

// CPP program to illustrate 
// Private Destructor
#include 
using namespace std;
  
class Test {
private:
    ~Test() {}
};
int main()
{
    Test* t;
}

上面的程序工作正常。没有正在构造的对象,程序仅创建“ Test *”类型的指针,因此不会破坏任何内容。

接下来,下面的程序呢?

// CPP program to illustrate 
// Private Destructor
  
#include 
using namespace std;
  
class Test {
private:
    ~Test() {}
};
int main()
{
    Test* t = new Test;
}

上面的程序也可以正常工作。当使用动态内存分配创建某些内容时,程序员有责任将其删除。因此,编译器不会打扰。

在将析构函数声明为私有的情况下,也可以使用malloc()函数创建该类的实例。在下面的程序中实现相同。

// CPP program to illustrate 
// Private Destructor 
  
#include 
using namespace std;
  
class Test {
public:
    Test() // Constructor
    {
        cout << "Constructor called\n";
    }
  
private:
    ~Test() // Private Destructor
    {
        cout << "Destructor called\n";
    }
};
  
int main()
{
    Test* t = (Test*)malloc(sizeof(Test));
    return 0;
}

输出:

但是,以下程序编译失败。当我们调用delete时,将调用析构函数。

// CPP program to illustrate 
// Private Destructor
#include 
using namespace std;
  
class Test {
private:
    ~Test() {}
};
int main()
{
    Test* t = new Test;
    delete t;
}

我们在上面的程序中注意到,当一个类具有私有析构函数时,只能创建该类的动态对象。以下是一种使用私有析构函数创建类并具有作为类朋友的函数的方法。该函数只能删除对象。

// CPP program to illustrate 
// Private Destructor
#include 
  
// A class with private destuctor
class Test {
private:
    ~Test() {}
    friend void destructTest(Test*);
};
  
// Only this function can destruct objects of Test
void destructTest(Test* ptr)
{
    delete ptr;
}
  
int main()
{
    // create an object
    Test* ptr = new Test;
  
    // destruct the object
    destructTest(ptr);
  
    return 0;
}

私有析构函数的用途是什么?

每当我们想要控制类对象的销毁时,我们都将析构函数设为私有。对于动态创建的对象,可能会发生以下情况:将指向该对象的指针传递给函数,然后该函数删除该对象。如果在函数调用后引用了对象,则该引用将变得悬而未决。有关更多详细信息,请参见此内容。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”