不想一個類被實例化通常有兩個目的:抽象類和工具類
抽象類
實現(xiàn)該類的的就是想成為一個抽象類,抽象類一般只被繼承,不能被實例化,例如最基本的例子
1.【動物類】是一個抽象類;
2.【猴子類】【貓類】【狗類】這三個類繼承自【動物類】;
3.【猴子類】【貓類】【狗類】可以被實例化;
4.【動物類】不能被實例化;
這種類更多的是用來定義接口,而完全不關(guān)心實現(xiàn)。
工具類
這種類提供一些功能但是一般不需要實現(xiàn)成一個實體,感覺上這種類更多的像是發(fā)揮了namespace的作用,或者說把一些功能模塊化,體現(xiàn)隔離或者解耦思想。例如一個所謂的【計算類】用于計算“加 減 乘 除”四種最簡單的計算。只需要提供 add(), sub(),multi(),div()四個方法就可以了,也不需要什么成員變量,也不需要維護什么狀態(tài)。
代碼實現(xiàn)
在代碼層面如何做到禁止類被實例化呢,一般是兩種辦法:
1.為類定義純虛成員函數(shù);
2.將構(gòu)造函數(shù)聲明為protect或者private。
純虛函數(shù)
pure virtual函數(shù)會導(dǎo)致抽象class,這是定理,因此只要為類提供一個pure virtual函數(shù)就可以達到禁止類被實例化的目的。但是這就是說我們必須要給這個類塞一個pure virtual函數(shù),為了阻止實例化硬塞一個pure virtual似乎不夠優(yōu)雅,有沒有別的方法呢。《Effective C++》條款7的表述就非常直接了:為你希望它成為抽象的那個class聲明一個pure virtual析構(gòu)函數(shù)。
但是抽象類一般通常是會被繼承的,具有多態(tài)目的,這導(dǎo)致需要為這個pure virtual析構(gòu)函數(shù)提供一份定義。這好像非常別扭因為Meyers在條款34中又說為pure virtual函數(shù)提供實現(xiàn)是“令人意外的”。當(dāng)然我們可以認為一個有定義的pure virtual析構(gòu)函數(shù)就是“實現(xiàn)抽象類的官方指定權(quán)威方法”。
因此,使用有定義的pure virtual析構(gòu)函數(shù)是阻止類被實例化的一個方法,但僅限于抽象類。
非public的構(gòu)造函數(shù)
如果目的是工具類怎么辦呢,一般的做法是把構(gòu)造方法聲明為private,自然就沒法實例化了,因為外界無法調(diào)用這個構(gòu)造函數(shù)。
但是如果這個類同時又提供了一個public靜態(tài)方法,這個靜態(tài)方法是可以調(diào)用私有
參考
http://www.ythuaji.com.cn/article/220525.html
http://www.ythuaji.com.cn/article/220526.html
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!
原文鏈接:https://blog.csdn.net/haolianglh/article/details/120519076