关于c++静态类的说法
關(guān)于C++的靜態(tài)類和C#中的靜態(tài)類的比較
在C++中,類不能有static修飾,
**C++靜態(tài)類是指只用于包含靜態(tài)成員的類型,不能進(jìn)行實(shí)例化。**當(dāng)我們聲明類的成員為靜態(tài)時(shí),這意味著無論創(chuàng)建多少個(gè)類的對(duì)象,靜態(tài)成員都只有一個(gè)副本。靜態(tài)成員在類的所有對(duì)象中是共享的。
我們不能把靜態(tài)成員的初始化放置在類的定義中,但是可以在類的外部通過使用范圍解析運(yùn)算符 :: 來重新聲明靜態(tài)變量從而對(duì)它進(jìn)行初始化。
靜態(tài)函數(shù)只要使用類名加范圍解析運(yùn)算符 :: 就可以訪問。
靜態(tài)成員函數(shù)只能訪問靜態(tài)成員數(shù)據(jù)、其他靜態(tài)成員函數(shù)和類外部的其他函數(shù)。
靜態(tài)成員函數(shù)有一個(gè)類范圍,他們不能訪問類的 this 指針。
靜態(tài)成員函數(shù)與普通成員函數(shù)的區(qū)別:- 靜態(tài)成員函數(shù)沒有 this 指針,只能訪問靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數(shù))。- 普通成員函數(shù)有 this 指針,可以訪問類中的任意成員;而靜態(tài)成員函數(shù)沒有 this 指針。而C#中:
靜態(tài)類是有static修飾的,
那為什么靜態(tài)類沒有必要存在C++中呢?
一個(gè)類是對(duì)一個(gè)概念的描述,類的本質(zhì)是它維護(hù)了一個(gè)不變式,也就是說它有一個(gè)狀態(tài),它所有的接口都是為了訪問或者獲取這個(gè)狀態(tài)以及跟狀態(tài)相關(guān)的操作。一個(gè)靜態(tài)類沒有狀態(tài),因此就沒有必要成為一個(gè)類。
C++由于具有傳值、傳址、啞元功能,使用靜態(tài)類不僅多余而且也完全沒有必要,相反,對(duì)Java、C#之類“改進(jìn)型語言”來說,由于為避免指針,防止過多的產(chǎn)生對(duì)象實(shí)例,就必須額外的引入一些新的“先進(jìn)性”的東西,比如靜態(tài)類。然而,靜態(tài)類本身是一個(gè)半成品(或是終極產(chǎn)品),由于其無法繼承,靜態(tài)類的產(chǎn)品化會(huì)因?yàn)椴槐闵?jí)而成為一種垃圾。
在《C#編程指南》中:
靜態(tài)類和類成員用于創(chuàng)建無需創(chuàng)建類的實(shí)例就能夠訪問的數(shù)據(jù)和函數(shù)。靜態(tài)類成員可用于分離獨(dú)立于任何對(duì)象標(biāo)識(shí)的數(shù)據(jù)和行為:無論對(duì)象發(fā)生什么更改,這些數(shù)據(jù)和函數(shù)都不會(huì)隨之變化。
當(dāng)類中沒有依賴對(duì)象標(biāo)識(shí)的數(shù)據(jù)或行為時(shí),就可以使用靜態(tài)類。
有此可見:
C++與C#關(guān)于靜態(tài)類有區(qū)別。
C#中,可以指定一個(gè)靜態(tài)的類。而C++中可以在類中聲明靜態(tài)的成員的類型。 當(dāng)一個(gè)類權(quán)卻脫離實(shí)例數(shù)據(jù)和對(duì)象時(shí)可以使用靜態(tài)類(C++中靜態(tài)的成員類型),對(duì)靜態(tài)成員變量智能是程序運(yùn)行時(shí)初始化,不能在類內(nèi)初始化。靜態(tài)類不需要,也沒有基類。
例如,在C++編程中,需要用到一個(gè)公共的數(shù)據(jù),可以單獨(dú)聲明一個(gè)類,
class ShareData { public:static QList<QByteArray> list;static QList<QString> listTest;static QList<tagPosInfo_t> webTagInfoSendlist;static uint16_t onlineAncNum;static uint16_t totalAncNUm;};在,類的外部初始化該靜態(tài)數(shù)據(jù):
//定義全局變量 QList<QByteArray> ShareData::list = QList<QByteArray>();QList<QString> ShareData::listTest = QList<QString>();QList<tagPosInfo_t> ShareData::webTagInfoSendlist = QList<tagPosInfo_t>();uint16_t ShareData:: onlineAncNum = 0; uint16_t ShareData:: totalAncNUm = 0;總結(jié)
以上是生活随笔為你收集整理的关于c++静态类的说法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt中qDebug()技巧初探
- 下一篇: VS C++生成dll和静态调用dll的