关于C++的静态类和C#中的静态类的比较
在C++中,类不能有static修饰,
**C++静态类是指只用于包含静态成员的类型,不能进行实例化。**当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。
我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。
静态函数只要使用类名加范围解析运算符 :: 就可以访问。
静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
静态成员函数有一个类范围,他们不能访问类的 this 指针。
静态成员函数与普通成员函数的区别:
- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。
而C#中:
静态类是有static修饰的,
仅包含静态成员,无法实例化,也就不能包含实例构造函数。但是可以声明静态构造函数分配初始值或设置某个静态状态。
那为什么静态类没有必要存在C++中呢?
一个类是对一个概念的描述,类的本质是它维护了一个不变式,也就是说它有一个状态,它所有的接口都是为了访问或者获取这个状态以及跟状态相关的操作。一个静态类没有状态,因此就没有必要成为一个类。
C++由于具有传值、传址、哑元功能,使用静态类不仅多余而且也完全没有必要,相反,对Java、C#之类“改进型语言”来说,由于为避免指针,防止过多的产生对象实例,就必须额外的引入一些新的“先进性”的东西,比如静态类。然而,静态类本身是一个半成品(或是终极产品),由于其无法继承,静态类的产品化会因为不便升级而成为一种垃圾。
在《C#编程指南》中:
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。
当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
有此可见:
C++与C#关于静态类有区别。
C#中,可以指定一个静态的类。而C++中可以在类中声明静态的成员的类型。 当一个类权却脱离实例数据和对象时可以使用静态类(C++中静态的成员类型),对静态成员变量智能是程序运行时初始化,不能在类内初始化。静态类不需要,也没有基类。
例如,在C++编程中,需要用到一个公共的数据,可以单独声明一个类,
class ShareData
{
public:
static QList<QByteArray> list;
static QList<QString> listTest;
static QList<tagPosInfo_t> webTagInfoSendlist;
static uint16_t onlineAncNum;
static uint16_t totalAncNUm;
};
在,类的外部初始化该静态数据:
//定义全局变量
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;