何時將析構函數聲明為私有?


參考:https://blog.csdn.net/HITXuQin/article/details/12850755

當我們將析構函數聲明為私有時,就意味着析構函數只能在類域中被調用,無法被外界(包括自己的對象)調用。  表現為:

1. 禁止用戶對此類型的變量進行定義,即禁止在棧內存空間內創建此類型的對象。要創建對象,只能用 new 在堆上進行。

2. 禁止用戶在程序中使用 delete 刪除此類型對象。對象的刪除只能在類內實現,也就是說只有類的實現者才有可能實現對對象的 delete,用戶不能隨便刪除對象。

如果用戶想刪除對象的話,只能按照類的實現者提供的方法進行。

class MyClass {

    ~MyClass();
int _age;
    std::string _name;

public:
    MyClass() = default;
    MyClass(int age,std::string name):_age(age),_name(name){}

    void destory() { 
    /* do something... */
    delete this; } };
#include "MyClass.h"

int main()
{
    MyClass  A;   // error !
    MyClass* B = new MyClass;
}

 

這樣做的動機:比如這樣一種情況,你希望在析構之前必須做一些事情,但是用你類的人並不知道,
那么你就可以重新寫一個函數,里面把要做的事情全部做完了再調用析構函數。
這樣人家只能調用你這個函數析構對象,從而保證了析構前一定會做你要求的動作。

除此之外:這樣做還會限制繼承。
如果一個類不打算作為基類,通常采用的方案就是將其析構函數聲明為private。  C++11中可以使用final關鍵字實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM