C++阻止類被實(shí)例化詳解
不想一個(gè)類被實(shí)例化通常有兩個(gè)目的:抽象類和工具類
抽象類
實(shí)現(xiàn)該類的的就是想成為一個(gè)抽象類,抽象類一般只被繼承,不能被實(shí)例化,例如最基本的例子
1.【動(dòng)物類】是一個(gè)抽象類;
2.【猴子類】【貓類】【狗類】這三個(gè)類繼承自【動(dòng)物類】;
3.【猴子類】【貓類】【狗類】可以被實(shí)例化;
4.【動(dòng)物類】不能被實(shí)例化;
這種類更多的是用來(lái)定義接口,而完全不關(guān)心實(shí)現(xiàn)。
工具類
這種類提供一些功能但是一般不需要實(shí)現(xiàn)成一個(gè)實(shí)體,感覺上這種類更多的像是發(fā)揮了namespace的作用,或者說(shuō)把一些功能模塊化,體現(xiàn)隔離或者解耦思想。例如一個(gè)所謂的【計(jì)算類】用于計(jì)算“加 減 乘 除”四種最簡(jiǎn)單的計(jì)算。只需要提供 add(), sub(),multi(),div()四個(gè)方法就可以了,也不需要什么成員變量,也不需要維護(hù)什么狀態(tài)。
代碼實(shí)現(xiàn)
在代碼層面如何做到禁止類被實(shí)例化呢,一般是兩種辦法:
1.為類定義純虛成員函數(shù);
2.將構(gòu)造函數(shù)聲明為protect或者private。
純虛函數(shù)
pure virtual函數(shù)會(huì)導(dǎo)致抽象class,這是定理,因此只要為類提供一個(gè)pure virtual函數(shù)就可以達(dá)到禁止類被實(shí)例化的目的。但是這就是說(shuō)我們必須要給這個(gè)類塞一個(gè)pure virtual函數(shù),為了阻止實(shí)例化硬塞一個(gè)pure virtual似乎不夠優(yōu)雅,有沒有別的方法呢?!禘ffective C++》條款7的表述就非常直接了:為你希望它成為抽象的那個(gè)class聲明一個(gè)pure virtual析構(gòu)函數(shù)。
但是抽象類一般通常是會(huì)被繼承的,具有多態(tài)目的,這導(dǎo)致需要為這個(gè)pure virtual析構(gòu)函數(shù)提供一份定義。這好像非常別扭因?yàn)镸eyers在條款34中又說(shuō)為pure virtual函數(shù)提供實(shí)現(xiàn)是“令人意外的”。當(dāng)然我們可以認(rèn)為一個(gè)有定義的pure virtual析構(gòu)函數(shù)就是“實(shí)現(xiàn)抽象類的官方指定權(quán)威方法”。
因此,使用有定義的pure virtual析構(gòu)函數(shù)是阻止類被實(shí)例化的一個(gè)方法,但僅限于抽象類。
非public的構(gòu)造函數(shù)
如果目的是工具類怎么辦呢,一般的做法是把構(gòu)造方法聲明為private,自然就沒法實(shí)例化了,因?yàn)橥饨鐭o(wú)法調(diào)用這個(gè)構(gòu)造函數(shù)。
但是如果這個(gè)類同時(shí)又提供了一個(gè)public靜態(tài)方法,這個(gè)靜態(tài)方法是可以調(diào)用私有
參考
http://www.dbjr.com.cn/article/224221.htm
//www.dbjr.com.cn/article/224216.htm
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼
猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。這篇文章將利用C語(yǔ)言中的循環(huán)語(yǔ)句、分支語(yǔ)句和函數(shù)實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-10-10C語(yǔ)言編程中對(duì)目錄進(jìn)行基本的打開關(guān)閉和讀取操作詳解
這篇文章主要介紹了C語(yǔ)言編程中對(duì)目錄進(jìn)行基本的打開關(guān)閉和讀取操作,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09使用?Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序的過程詳解
Visual?Studio?2022?引入了用于?Linux?C++?開發(fā)的本機(jī)?WSL2?工具集,可以構(gòu)建和調(diào)試?Linux?C++?代碼,并提供了非常好的?Linux?文件系統(tǒng)性能、GUI?支持和完整的系統(tǒng)調(diào)用兼容性,這篇文章主要介紹了使用Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序,需要的朋友可以參考下2021-11-11