參考: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關鍵字實現。