1. 静态成员简介
在OOP(面向对象编程)中,静态成员在类中的所有实例之间共享。使用static
关键字声明的成员变量存储在一个地方。非静态数据成员为每个类对象变量创建。
如果不能声明类的静态成员,我们可能需要在程序的全局级别声明这些数据,这将打破数据与其类之间的关系。静态成员允许类数据在类范围内存在,而不是特定于特定实例。
静态类成员与特定实例无关,因此对它的引用格式为:class_name::variable
。在类方法中访问静态成员时,上下文运算符::
是可选的。
2. 静态成员的初始化
静态类成员必须在全局范围内明确初始化。例如,我们有一个用于解析文本的类,我们需要计算处理的单词和字符的总数。只需要将必要的类成员声明为静态并在全局级别初始化它们,然后类的所有实例都将使用公共的单词和字符计数器。
class TextAnalyzer
{
public:
static int totalWords;
static int totalCharacters;
};
int TextAnalyzer::totalWords = 0;
int TextAnalyzer::totalCharacters = 0;
3. 静态常量成员
静态类成员可以用const
关键字声明,这样的静态常数必须在全局级别与const
关键字初始化。
class DataContainer
{
private:
static const int maxItems;
};
const int DataContainer::maxItems = 100;
4. this指针
关键字this
表示指向其本身的隐式声明的指针,即在其上下文中执行方法的类的特定实例。它只能在类的非静态方法中使用。在静态函数中,您只能访问类的静态成员/方法。
5. 静态方法
在MQL4中,可以使用类型为static
的成员函数。静态修饰符必须在类内部的声明中位于函数的返回类型之前。
class Box
{
public:
static int CalculateVolume();
private:
int length;
static const int maxHeight;
};
int Box::CalculateVolume()
{
return maxHeight;
}
const int Box::maxHeight = 10;
6. const修饰符
带有const
修饰符的方法被称为常量,不能修改其类的隐式成员。const
修饰符确保对象的值的一致性,并在编译期间返回错误(如果存在错误)。
class Shape
{
private:
double length;
double width;
public:
double Area() const;
static double Area(const double l, const double w);
};
double Shape::Area() const
{
return Area(length, width);
}
static double Shape::Area(const double l, const double w)
{
return l * w;
}
通过使用常量性控制,编译器会生成特殊的优化,例如,将常量对象放在只读内存中。静态函数不能用const
修饰符确定,因为这个修饰符确保在调用此函数时实例成员的常量性。但是,如上所述,静态函数不能访问非静态类成员。