国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】特殊類的設(shè)計(jì)(只在堆、棧創(chuàng)建對(duì)象,單例對(duì)象)

這篇具有很好參考價(jià)值的文章主要介紹了【C++】特殊類的設(shè)計(jì)(只在堆、棧創(chuàng)建對(duì)象,單例對(duì)象)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??博客主頁: 主頁
??系列專欄: C++
??感謝大家點(diǎn)贊??收藏?評(píng)論??
??期待與大家一起進(jìn)步!



一、請(qǐng)?jiān)O(shè)計(jì)一個(gè)類,只能在堆上創(chuàng)建對(duì)象

實(shí)現(xiàn)方式:

  1. 將類的構(gòu)造函數(shù)私有,拷貝構(gòu)造聲明成私有。防止別人調(diào)用拷貝在棧上生成對(duì)象。
  2. 提供一個(gè)靜態(tài)的成員函數(shù),在該靜態(tài)成員函數(shù)中完成堆對(duì)象的創(chuàng)建
class HeapOnly
{
public:
	static HeapOnly* CreateObj()
	{
		return new HeapOnly;
	}
private:
	HeapOnly()
	{
		//...
	}

	HeapOnly(const HeapOnly& hp) = delete;
	HeapOnly& operator=(const HeapOnly& hp) = delete;
};

二、 請(qǐng)?jiān)O(shè)計(jì)一個(gè)類,只能在棧上創(chuàng)建對(duì)象

實(shí)現(xiàn)方法:
1.同上將構(gòu)造函數(shù)私有化,然后設(shè)計(jì)靜態(tài)方法創(chuàng)建對(duì)象返回即可
2.禁用堆上的創(chuàng)建方式,new=operator new+構(gòu)造函數(shù)
3.operator new 是系統(tǒng)提供的全局函數(shù),new在底層調(diào)用operator new全局函數(shù)來申請(qǐng)空間

class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		return StackOnly();
	}

	// 禁掉operator new可以把下面用new 調(diào)用拷貝構(gòu)造申請(qǐng)對(duì)象給禁掉
 // StackOnly obj = StackOnly::CreateObj();
 // StackOnly* ptr3 = new StackOnly(obj);
	//  new==operator new + 構(gòu)造
	//delete==析構(gòu)+operator delete
	void* operator new(size_t size) = delete;
	void operator delete(void* p) = delete;
private:
	//構(gòu)造函數(shù)私有化
	//拷貝構(gòu)造函數(shù)不能私有化,因?yàn)槲覀兩厦鍯reateObj()返回,需要
	//用到拷貝構(gòu)造函數(shù)
	StackOnly()
		:_a(0)
	{}
private:
	int _a;
};

三、 請(qǐng)?jiān)O(shè)計(jì)一個(gè)類,不能被繼承

1.方法一:

//  構(gòu)造函數(shù)私有化,派生類中調(diào)不到基類的構(gòu)造函數(shù)。則無法繼承
class NonInherit
{
public:
 static NonInherit GetInstance()
 {
 return NonInherit();
 }
private:
 NonInherit()
 {}
};

2.方法二:

//final關(guān)鍵字,final修飾類,表示該類不能被繼承。
class A  final
{
    // ....
};

四、請(qǐng)?jiān)O(shè)計(jì)一個(gè)類,只能創(chuàng)建一個(gè)對(duì)象(單例模式)

單例模式:
一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,即單例模式,該模式可以保證系統(tǒng)中該類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn),該實(shí)例被所有程序模塊共享。 比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中,這些配置數(shù)據(jù)由一個(gè)單例對(duì)象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對(duì)象再通過這個(gè)單例對(duì)象獲取這些配置信息,這種方式簡(jiǎn)化了在復(fù)雜環(huán)境下的配置管理

1.餓漢模式

就是說不管你將來用不用,程序啟動(dòng)時(shí)就創(chuàng)建一個(gè)唯一的實(shí)例對(duì)象。

class Singleton
{
public:
	// 2、提供獲取單例對(duì)象的接口函數(shù)
	static Singleton& GetInstance()
	{
		return _sinst;
	}

private:
	// 1、構(gòu)造函數(shù)私有
	//構(gòu)造函數(shù)私有也不能調(diào)用new了
	Singleton()
	{
		// ...
	}

	// 3、防拷貝
	Singleton(const Singleton& s) = delete;
	Singleton& operator=(const Singleton& s) = delete;

	static Singleton _sinst;
	//雖然為靜態(tài)類型,但依然可以使用對(duì)應(yīng)類里面的構(gòu)造函數(shù)
};
Singleton Singleton::_sinst;// 在程序入口之前就完成單例對(duì)象的初始化

餓漢模式:一開始(main函數(shù)之前)就創(chuàng)建單例對(duì)象
1、如果單例對(duì)象初始化內(nèi)容很多,影響啟動(dòng)速度
2、如果兩個(gè)單例類,互相有依賴關(guān)系。
假設(shè)有A B兩個(gè)單例類,要求A先創(chuàng)建,B再創(chuàng)建,B的初始化創(chuàng)建依賴A,但在main的外面沒辦法確定哪個(gè)類先被創(chuàng)建,可能會(huì)出現(xiàn)問題

2.懶漢模式

如果單例對(duì)象構(gòu)造十分耗時(shí)或者占用很多資源,比如加載插件啊, 初始化網(wǎng)絡(luò)連接啊,讀取文件啊等等,而有可能該對(duì)象程序運(yùn)行時(shí)不會(huì)用到,那么也要在程序一開始就進(jìn)行初始化,就會(huì)導(dǎo)致程序啟動(dòng)時(shí)非常的緩慢。 所以這種情況使用懶漢模式(延遲加載)更好。

1.普通場(chǎng)景

class Singleton
	{
	public:
		// 2、提供獲取單例對(duì)象的接口函數(shù)
		static Singleton& GetInstance()
		{
			if (_psinst == nullptr)
			{
				// 第一次調(diào)用GetInstance的時(shí)候創(chuàng)建單例對(duì)象
				_psinst = new Singleton;
			}

			return *_psinst;
		}

	private:
		// 1、構(gòu)造函數(shù)私有
		Singleton()
		{
			// ...
		}

		~Singleton()
		{
		 
		}

		// 3、防拷貝
		Singleton(const Singleton& s) = delete;
		Singleton& operator=(const Singleton& s) = delete;

	 

		static Singleton* _psinst;
	 
	};
	Singleton* Singleton::_psinst = nullptr;

2.特殊場(chǎng)景

1、中途需要顯示釋放
static void DelInstance()
		{
			if (_psinst)
			{
				delete _psinst;
				_psinst = nullptr;
			}
			//自己寫一個(gè)靜態(tài)的函數(shù),進(jìn)行釋放操作
		}
2.程序結(jié)束時(shí),需要做一些特殊動(dòng)作(如持久化)

方法:
1.我們把要寫入的數(shù)據(jù)過程放到析構(gòu)函數(shù)中
2.我們可以像智能指針那樣使用,在類里面再定義一個(gè)類GC,讓GC的析構(gòu)函數(shù)專門用來管理Singleton的析構(gòu)函數(shù),然后創(chuàng)建GC的對(duì)象,因?yàn)镚C不是指針類型為普通類型,程序結(jié)束的時(shí)候會(huì)自動(dòng)調(diào)用其析構(gòu)函數(shù),這樣也就完成了Singleton的析構(gòu)函數(shù)

class GC
		{
		public:
			~GC()
			{
				 Singleton::DelInstance();
			}
		};
		 
	~Singleton()
		{
			cout << "~Singleton()" << endl;

			// map數(shù)據(jù)寫到文件中
			FILE* fin = fopen("map.txt", "w");
			for (auto& e : _dict)
			{
				fputs(e.first.c_str(), fin);
				fputs(":", fin);
				fputs(e.second.c_str(), fin);
				fputs("\n", fin);
			}
		}

【C++】特殊類的設(shè)計(jì)(只在堆、棧創(chuàng)建對(duì)象,單例對(duì)象),c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-736237.html

3.源碼
class Singleton
	{
	public:
		// 2、提供獲取單例對(duì)象的接口函數(shù)
		static Singleton& GetInstance()
		{
			if (_psinst == nullptr)
			{
				// 第一次調(diào)用GetInstance的時(shí)候創(chuàng)建單例對(duì)象
				_psinst = new Singleton;
			}

			return *_psinst;
		}

		// 一般單例不用釋放。
		// 特殊場(chǎng)景:1、中途需要顯示釋放  2、程序結(jié)束時(shí),需要做一些特殊動(dòng)作(如持久化)
		static void DelInstance()
		{
			if (_psinst)
			{
				delete _psinst;
				_psinst = nullptr;
			}
		}

		 
		class GC
		{
		public:
			~GC()
			{
				 Singleton::DelInstance();
			}
		};

	private:
		// 1、構(gòu)造函數(shù)私有
		Singleton()
		{
			// ...
		}

		~Singleton()
		{
			cout << "~Singleton()" << endl;

			// map數(shù)據(jù)寫到文件中
			FILE* fin = fopen("map.txt", "w");
			for (auto& e : _dict)
			{
				fputs(e.first.c_str(), fin);
				fputs(":", fin);
				fputs(e.second.c_str(), fin);
				fputs("\n", fin);
			}
		}

		// 3、防拷貝
		Singleton(const Singleton& s) = delete;
		Singleton& operator=(const Singleton& s) = delete;

		map<string, string> _dict;
		// ...

		static Singleton* _psinst;
		static GC _gc;
	};

	Singleton* Singleton::_psinst = nullptr;
	Singleton::GC Singleton::_gc;
 
 


	class A {
	public:
		A() {
			cout << "gouzao" << endl;
		}
		~A() {
			cout << "析構(gòu)函數(shù)" << endl;
		}
	};

到了這里,關(guān)于【C++】特殊類的設(shè)計(jì)(只在堆、棧創(chuàng)建對(duì)象,單例對(duì)象)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++之特殊類的設(shè)計(jì)

    C++之特殊類的設(shè)計(jì)

    目錄 一、單例模式 1、設(shè)計(jì)模式 2、單例模式 1、餓漢模式 2、懶漢模式 3、單例對(duì)象的釋放問題 二、設(shè)計(jì)一個(gè)不能被拷貝的類 三、設(shè)計(jì)一個(gè)只能在堆上創(chuàng)建對(duì)象的類 四、設(shè)計(jì)一個(gè)只能在棧上創(chuàng)建對(duì)象的類 五、設(shè)計(jì)一個(gè)不能被繼承的類 概念: 設(shè)計(jì)模式(Design Pattern)是一套被

    2024年02月08日
    瀏覽(23)
  • C++進(jìn)階 特殊類的設(shè)計(jì)

    C++進(jìn)階 特殊類的設(shè)計(jì)

    本篇博客介紹:介紹幾種特殊的類 我們的拷貝只會(huì)發(fā)生在兩個(gè)場(chǎng)景當(dāng)中 拷貝構(gòu)造函數(shù) 賦值運(yùn)算符重載 所以說我們只需要讓類失去 或者說不能使用這兩個(gè)函數(shù)即可 這里有兩個(gè)解決方案 在C++98中 我們將拷貝構(gòu)造函數(shù)只聲明不定義 并且將其訪問權(quán)限設(shè)置為私有即可 原因如下

    2024年02月12日
    瀏覽(17)
  • C++特殊類設(shè)計(jì)(單例模式)

    C++98 將拷貝構(gòu)造函數(shù)與賦值運(yùn)算符重載只聲明不定義,并且將其訪問權(quán)限設(shè)置為私有即可。 原因: 設(shè)置成私有:如果只聲明沒有設(shè)置成private,用戶自己如果在類外定義了,就可以不能禁止拷貝了 只聲明不定義:不定義是因?yàn)樵摵瘮?shù)根本不會(huì)調(diào)用,定義了其實(shí)也沒有什么意義

    2024年01月19日
    瀏覽(24)
  • 【C++】特殊類設(shè)計(jì)(單例模式)

    【C++】特殊類設(shè)計(jì)(單例模式)

    設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。 使用設(shè)計(jì)模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。 根本原因是為了代碼復(fù)用,增加可維護(hù)性。 設(shè)計(jì)模式的例子:迭代器模式 拷貝一共就只有兩個(gè)場(chǎng)景,一

    2023年04月22日
    瀏覽(23)
  • 【C++】特殊類的設(shè)計(jì) | 類型轉(zhuǎn)換

    【C++】特殊類的設(shè)計(jì) | 類型轉(zhuǎn)換

    設(shè)計(jì)模式是 被反復(fù)使用 多數(shù)人知曉 經(jīng)過分類的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié) 單例模式: 一個(gè)類只能創(chuàng)建一個(gè)對(duì)象 即單例模式,該模式可以保證系統(tǒng)中該類只有一個(gè)實(shí)例 單例模式分為餓漢模式和懶漢模式 餓漢模式 一開始就創(chuàng)建對(duì)象(main函數(shù)之前) 假設(shè)想要vector數(shù)組全局只有一份

    2024年02月15日
    瀏覽(15)
  • C++特殊類的設(shè)計(jì)與類型轉(zhuǎn)換

    C++特殊類的設(shè)計(jì)與類型轉(zhuǎn)換

    通過new創(chuàng)建的類就是堆上的。 方法一: 這里主要以封禁構(gòu)造函數(shù)為主,讓外部只能通過調(diào)用func函數(shù)方式去創(chuàng)建對(duì)象,func函數(shù)的內(nèi)部是通過new創(chuàng)建的,這里要注意的就是拷貝構(gòu)造的問題。 賦值重載不用刪除,因?yàn)樾枰F(xiàn)有一個(gè)對(duì)象才能賦值給另一個(gè)對(duì)象,上面的代碼只會(huì)創(chuàng)

    2024年02月08日
    瀏覽(16)
  • C++:特殊類的設(shè)計(jì)和類型轉(zhuǎn)換

    1.設(shè)計(jì)一個(gè)類,不能被拷貝 拷貝只會(huì)放生在兩個(gè)場(chǎng)景中: 拷貝構(gòu)造函數(shù)以及賦值運(yùn)算符重載 ,因此想要讓一個(gè)類禁止拷貝,只需讓該類不能調(diào)用拷貝構(gòu)造函數(shù)以及賦值運(yùn)算符重載即可。 2.設(shè)計(jì)一個(gè)類,只能在堆上創(chuàng)建對(duì)象 兩種實(shí)現(xiàn)方式: 將類的 構(gòu)造函數(shù)私有 , 拷貝構(gòu)造聲

    2024年01月24日
    瀏覽(23)
  • 【C++】特殊類設(shè)計(jì)+單例模式+類型轉(zhuǎn)換

    【C++】特殊類設(shè)計(jì)+單例模式+類型轉(zhuǎn)換

    需要云服務(wù)器等云產(chǎn)品來學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ? 目錄 一、設(shè)計(jì)一個(gè)類,不能被拷貝 1、C++98 2、C++11 二、設(shè)計(jì)一個(gè)類,只能在堆上創(chuàng)建對(duì)象 1、將構(gòu)造設(shè)為私有 2、將析構(gòu)設(shè)為

    2024年02月06日
    瀏覽(23)
  • 從C語言到C++_37(特殊類設(shè)計(jì)和C++類型轉(zhuǎn)換)單例模式

    從C語言到C++_37(特殊類設(shè)計(jì)和C++類型轉(zhuǎn)換)單例模式

    目錄 1. 特殊類設(shè)計(jì) 1.1 不能被拷貝的類 1.2 只能在堆上創(chuàng)建的類 1.3 只能在棧上創(chuàng)建的類 1.4 不能被繼承的類 1.5 只能創(chuàng)建一個(gè)對(duì)象的類(單例模式)(重點(diǎn)) 1.5.1 餓漢模式 1.5.2?懶漢模式 2.?類型轉(zhuǎn)換 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI(了解)和類型轉(zhuǎn)換常見面

    2024年02月10日
    瀏覽(26)
  • C++設(shè)計(jì)模式創(chuàng)建型之單例模式

    一、概述 ? ? ? ? 單例模式也稱單態(tài)模式,是一種創(chuàng)建型模式,用于創(chuàng)建只能產(chǎn)生一個(gè)對(duì)象實(shí)例的類。例如,項(xiàng)目中只存在一個(gè)聲音管理系統(tǒng)、一個(gè)配置系統(tǒng)、一個(gè)文件管理系統(tǒng)、一個(gè)日志系統(tǒng)等,甚至如果吧整個(gè)Windows操作系統(tǒng)看成一個(gè)項(xiàng)目,那么其中只存在一個(gè)任務(wù)管理

    2024年02月14日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包