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