wordpress ip更換域名給你一個網(wǎng)站seo如何做
目錄
一、設(shè)計一個禁止拷貝的類
二、設(shè)計一個只能在堆區(qū)上創(chuàng)建對象的類
三、設(shè)計一個只能在棧區(qū)和靜態(tài)區(qū)上創(chuàng)建對象的類
四、設(shè)計一個不能繼承的類
五、設(shè)計一個只能創(chuàng)建一個對象的類(單例模式)
?
一、設(shè)計一個禁止拷貝的類
拷貝只會發(fā)生在兩個場景中,分別是拷貝構(gòu)造和賦值,因此想要讓一個類禁止拷貝,只需要讓該類對象不能調(diào)用拷貝構(gòu)造函數(shù)以及賦值運算符重載即可。
-
C++98/03:
class CopyBan { public:CopyBan() { } private:CopyBan(const CopyBan& cb);CopyBan& operator=(const CopyBan& cb); }; ? int main() {CopyBan cb1;// CopyBan cb2(cb1); // error// CopyBan cb3;// cb3 = cb1; // errorreturn 0; }
-
C++11:
class CopyBan { public:CopyBan() { }CopyBan(const CopyBan& cb) = delete;CopyBan& operator=(const CopyBan& cb) = delete; }; ? int main() {CopyBan cb1;// CopyBan cb2(cb1); // error// CopyBan cb3;// cb3 = cb1; // errorreturn 0; }
二、設(shè)計一個只能在堆區(qū)上創(chuàng)建對象的類
-
將類的構(gòu)造函數(shù)設(shè)置為私有,同時禁止拷貝構(gòu)造函數(shù)的生成,防止通過拷貝構(gòu)造創(chuàng)建對象;最后提供一個創(chuàng)建堆對象的靜態(tài)成員函數(shù)。
#include <iostream> using namespace std;class HeapOnly { public:static HeapOnly* Create(){return new HeapOnly;} private:HeapOnly(){cout << "HeapOnly()" << endl;}HeapOnly(const HeapOnly& ho) = delete; };int main() {// HeapOnly ho; // error// static HeapOnly sho; // errorHeapOnly* pho = HeapOnly::Create(); // HeapOnly()// HeapOnly copy(*pho); // errordelete pho;return 0; }
-
將類的析構(gòu)函數(shù)設(shè)置為私有,然后提供一個完成 delete 操作的靜態(tài)成員函數(shù)。
#include <iostream> using namespace std;class HeapOnly { public:void Destroy(){delete this;} private:~HeapOnly(){cout << "~HeapOnly()" << endl;} };int main() {// HeapOnly ho; // error// static HeapOnly sho; // errorHeapOnly* pho = new HeapOnly;// HeapOnly copy(*pho); // errorpho->Destroy(); // ~HeapOnly()return 0; }
三、設(shè)計一個只能在棧區(qū)和靜態(tài)區(qū)上創(chuàng)建對象的類
-
將類的構(gòu)造函數(shù)設(shè)置為私有,然后提供一個創(chuàng)建對象的靜態(tài)成員函數(shù)。
#include <iostream> using namespace std; ? class StackStaticOnly { public:static StackStaticOnly CreateObj(){return StackStaticOnly();} private:StackStaticOnly(){cout << "StackStaticOnly()" << endl;} }; ? int main() {StackStaticOnly sso = StackStaticOnly::CreateObj(); ?// StackStaticOnly()static StackStaticOnly ssso = StackStaticOnly::CreateObj(); ?// StackStaticOnly()// StackStaticOnly* psso1 = new StackStaticOnly; // error// 注意:該方法無法防止以下的情況發(fā)生// StackStaticOnly* psso2 = new StackStaticOnly(sso); // ok// 如果禁止拷貝構(gòu)造函數(shù)的生成,會導(dǎo)致 CreateObj 函數(shù)發(fā)生錯誤return 0; }
-
直接禁止 operator new 和 operator delete 的生成。
class StackStaticOnly {void* operator new(size_t size) = delete;void operator delete(void* p) = delete; }; ? int main() {StackStaticOnly sso;static StackStaticOnly ssso;// StackStaticOnly* psso1 = new StackStaticOnly; // error// StackStaticOnly* psso2 = new StackStaticOnly(sso); // errorreturn 0; }
四、設(shè)計一個不能繼承的類
-
C++98/03:
將基類的構(gòu)造函數(shù)設(shè)置私有,派生類就無法調(diào)用基類的構(gòu)造函數(shù),因此無法繼承。
class NonInherit { public:static NonInherit CreateObj(){return NonInherit();} private:NonInherit() { } };
-
C++11:
使用 final 關(guān)鍵字修飾類,表示該類不能被繼承。
class NonInherit final { };
五、設(shè)計一個只能創(chuàng)建一個對象的類(單例模式)
設(shè)計模式(Design Pattern)是一種針對軟件設(shè)計中經(jīng)常出現(xiàn)的問題和解決方案的標(biāo)準(zhǔn)化描述。它們可以被視為是經(jīng)驗豐富的軟件開發(fā)人員在解決類似問題時總結(jié)出來的設(shè)計思路、原則和指導(dǎo)。設(shè)計模式幫助我們以一種可重用的方式來解決特定的設(shè)計問題,從而使代碼更具靈活性、可維護性和可擴展性。
單例模式:一個類只能創(chuàng)建一個對象。該模式可以保證系統(tǒng)中該類只有一個實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。比如在某個服務(wù)器程序中,該服務(wù)器的配置信息存放在一個文件中,這些配置數(shù)據(jù)由一個單例對象統(tǒng)一讀取,然后服務(wù)進程中的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在復(fù)雜環(huán)境下的配置管理。
單例模式有以下兩種實現(xiàn)模式:
-
餓漢模式:
在程序入口之前就完成了單例對象的初始化。
#include <iostream> using namespace std; ? class Singleton { public:// 提供一個獲取單例對象的靜態(tài)成員函數(shù)static Singleton& GetInstance(){return _ss;} private:// 將類的構(gòu)造函數(shù)設(shè)置為私有Singleton() {cout << "Singleton()" << endl;} ?// 禁止拷貝構(gòu)造函數(shù)的生成Singleton(const Singleton& s) = delete; ?static Singleton _ss; ?// 注意:靜態(tài)成員變量屬于類,不屬于某個具體的對象 }; ? Singleton Singleton::_ss; ?// Singleton() ? int main() {cout << &Singleton::GetInstance() << endl;cout << &Singleton::GetInstance() << endl;// 輸出的兩個地址是相同的 ?// Singleton copy(Singleton::GetInstance()); // errorreturn 0; }
-
懶漢模式:
如果單例對象構(gòu)造十分耗時或者占用很多資源,比如加載插件、初始化網(wǎng)絡(luò)連接、讀取文件等等,而該對象在程序運行時又有可能不會用到,那么使用餓漢模式,在程序入口之前就完成單例對象的初始化,會導(dǎo)致程序啟動時變得非常緩慢,所以在這種情況下使用懶漢模式(延遲加載)更好。
#include <iostream> using namespace std; ? class Singleton { public:static Singleton& GetInstance(){if (_pss == nullptr){_pss = new Singleton;}return *_pss;} ?// 一般情況下,單例對象是不需要釋放的,// 特殊場景:// 1、中途需要顯示釋放// 2、程序結(jié)束時,需要做一些特殊動作,比如持久化static void DelInstance(){if (_pss){delete _pss;_pss = nullptr;}} private:Singleton(){cout << "Singleton()" << endl;} ?~Singleton(){cout << "~Singleton()" << endl;} ?Singleton(const Singleton& s) = delete; ?static Singleton* _pss; }; ? Singleton* Singleton::_pss = nullptr; ? int main() {cout << &Singleton::GetInstance() << endl;cout << &Singleton::GetInstance() << endl;// Singleton()// 輸出的兩個地址是相同的 ?// Singleton copy(Singleton::GetInstance()); // error ?Singleton::DelInstance();// ~Singleton()return 0; }