真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

教你如何用C++創(chuàng)建一個(gè)特殊的類-創(chuàng)新互聯(lián)

就語(yǔ)言而言,個(gè)人還是比較喜歡C++,盡管 C++有些語(yǔ)法方面確實(shí)比較深?yuàn)W,但這些確實(shí)擋不住它在實(shí)際應(yīng)用中不可被替代的位置。

在尋甸等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,尋甸網(wǎng)站建設(shè)費(fèi)用合理。

    開(kāi)始談今天的重點(diǎn),如何定義一個(gè)特殊的C++類。

1、定義不可被繼承的C++類

    如何讓一個(gè)類不能被繼承呢?簡(jiǎn)單來(lái)說(shuō),我們希望達(dá)到的效果,就是如果繼承這個(gè)類的話,編譯直接報(bào)錯(cuò)。

    實(shí)現(xiàn)這個(gè)類,我希望你提前了解過(guò)以下幾個(gè)C++的簡(jiǎn)單語(yǔ)法:友元類、虛繼承。這里我直接告訴你如何來(lái)定義,接下來(lái)我們討論為什么。

    第一步:定義一個(gè)空類A,顯式給出構(gòu)造和析構(gòu),構(gòu)造和析構(gòu)必須定義為private。

    第二步:定義不可被繼承的類B,給出正常的構(gòu)造和析構(gòu),public類型,讓 B虛繼承A類,繼承方式不限,同時(shí)將B設(shè)置為A的友元類。

    第三步:定義類C去嘗試虛擬繼承類B,編譯錯(cuò)誤!

代碼如下:

class A
{
	friend class B;
private:
	A(){}
	~A(){}
};

class B:virtual public A
{
public:
	B()
	{}
};

class C :public B
{
public:
	C()
	{}
};

我們來(lái)討論,為什么編譯會(huì)出錯(cuò)?

    首先,將類A的構(gòu)造函數(shù)和析構(gòu)函數(shù)定義為私有,如果沒(méi)有顯示定義,默認(rèn)的構(gòu)造和析構(gòu)函數(shù)是public的。那定義為protected類型可以嗎?答案是“NO”。了解過(guò)繼承的話,應(yīng)該知道,基類中private類型的成員變量或方法,在所有派生類中是不可見(jiàn),但protected類型的成員變量或方法是可見(jiàn)的。我們的目的是如果以后構(gòu)造類A的派生類時(shí),需要調(diào)用類A構(gòu)造,必須在類A內(nèi)部調(diào)用該方法,即使是派生類,我也希望它遵守,即對(duì)派生類不可見(jiàn)。

    其次,類B繼承了類A,繼承方式無(wú)所謂,因?yàn)榛愃接胁糠植徽撘院畏N方式繼承,都是不可見(jiàn)的。為什么要虛繼承呢?這個(gè)稍后說(shuō)。同時(shí),類B這里定義成類A的友元類,那么以后類B就可以直接訪問(wèn)類A的私有成員了,也就是說(shuō),這里的友元,打破了我們一開(kāi)始定義的對(duì)派生類不可見(jiàn)的限制。那么以后在使用類B實(shí)例化對(duì)象時(shí),完全可以成功,構(gòu)造基類部分是通過(guò)友元實(shí)現(xiàn)的,和繼承方式無(wú)關(guān)。這里的類B就是我們定義的不可被繼承的類。

    最后,我們嘗試讓類C繼承類B,那么當(dāng)類C實(shí)例化對(duì)象時(shí)(或顯式定義了構(gòu)造函數(shù)),就會(huì)首先去構(gòu)造屬于類B的部分。這里注意,如果類B不是虛繼承類A的話,那么這里構(gòu)造屬于類B的部分時(shí),是通過(guò)類B構(gòu)造類A部分,這必然是成功的。但我們不希望,因此,這里類B虛繼承了類A,當(dāng)構(gòu)造屬于類B部分時(shí),由于B虛繼承了A,那么會(huì)由類C直接去訪問(wèn)A,嘗試構(gòu)造類A的部分,很明顯,由于訪問(wèn)不到類A的構(gòu)造函數(shù),因此C實(shí)例化對(duì)象失敗。之后,所有嘗試?yán)^承類B的類都會(huì)在編譯時(shí)失?。ㄇ疤嵋驝顯示給出了構(gòu)造,或類C實(shí)例化了對(duì)象)。

    到這里,不可被繼承了類B創(chuàng)建成功,這里很巧妙的應(yīng)用了友元類的概念,從而實(shí)現(xiàn)了僅有B可以實(shí)例化屬于A的部分。

    如果覺(jué)得這種方式太過(guò)靈活,不容易理解,那么還有一種更加簡(jiǎn)單的方式。C++11引入了final關(guān)鍵字,被該關(guān)鍵字修飾的類,都是不可被繼承的,這個(gè)和java中的用法基本是一致的。

class A final
{
public:
	A(){}
};

class B :public A        // 編譯出錯(cuò)
{};

2、定義一個(gè)只可以在棧上創(chuàng)建對(duì)象的類

    如果上面那種情況理解的話,這里應(yīng)該不會(huì)太難。為什么只可以在棧上創(chuàng)建對(duì)象?如何實(shí)現(xiàn)?其實(shí)很簡(jiǎn)單,只要我們只對(duì)外暴露出可以在堆上創(chuàng)建對(duì)象的接口就可以。代碼如下:

class A
{
public:
	static A* Get_A(int x)
	{
		return new A(x);
	}
	static void Delete_A(A* a)
	{
		delete a;
	}
private:
	A(int a = 10)
		:_a(a)
	{}
private:
	int _a;
};

int main()
{
	A* pa = A::Get_A(9);
	A* pb = A::Get_A(7);
	return 0;
}

    和之前一樣,將構(gòu)造函數(shù)和析構(gòu)函數(shù)都設(shè)置為私有(因?yàn)檫@里不涉及繼承,private和protected在這里沒(méi)有區(qū)別),由于構(gòu)造函數(shù)都是私有的,無(wú)法創(chuàng)建對(duì)象,因此,提供了靜態(tài)方法,該方法中通過(guò)new和delete實(shí)現(xiàn)了在堆上對(duì)象的獲取和釋放。

3、定義一個(gè)只可以在棧上創(chuàng)建對(duì)象的類

    如果理解了上一種,就應(yīng)該知道這里該如何去做。只要我們只提供在棧上獲取對(duì)象的方式即可,由于??臻g是由操作系統(tǒng)維護(hù)了,沒(méi)有特殊需要,析構(gòu)函數(shù)就沒(méi)有必要顯式給出,代碼如下:

class A
{
public:
	static A Get_A(int x)
	{
		return A(x);
	}
private:
	A(int a = 10)
		:_a(a)
	{}
private:
	int _a;
};

int main()
{
	A pa = A::Get_A(9);
	A pb = A::Get_A(7);
	return 0;
}

   只能在棧上或者只能在堆上創(chuàng)建的對(duì)象,實(shí)現(xiàn)起來(lái)原理是一樣的,類的構(gòu)造和析構(gòu)函數(shù)都設(shè)置為私有,當(dāng)我的接口函數(shù)提供的方法是從堆中創(chuàng)建的對(duì)象時(shí),類就只能在堆上創(chuàng)建對(duì)象,當(dāng)我的接口函數(shù)提供的是從棧上直接得到的對(duì)象的話,類就只可以在棧上創(chuàng)建對(duì)象。需要注意一點(diǎn)的是,創(chuàng)建棧上對(duì)象的時(shí)候,不可以返回臨時(shí)對(duì)象的引用,這個(gè)就不再多解釋。

------muhuizz整理

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文標(biāo)題:教你如何用C++創(chuàng)建一個(gè)特殊的類-創(chuàng)新互聯(lián)
本文URL:http://weahome.cn/article/jospi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部