我有一个工作的代码库,它有一个名为Tabs的类。此类的所有方法和变量都定义为static。我知道类的静态成员由该类对象的所有实例共享。此类用于将某些类型的数据存储为集合。许多不同的文件使用成员函数Tabs :: find()和Tabs :: Insert()而不会实例化类Tabs的对象。我试图理解这是如何工作的以及这种编程技术的名称。感谢。
答案 0 :(得分:4)
static
数据成员在main
输入之前初始化,这就是访问它们的原因。它们驻留在静态内存中,而不是动态或自动。
只有静态成员的类与具有全局变量和函数类似,但是组合在一起。它本身并不是一种编程技术。它只是全局的。
//globals.h
class Globals
{
static int x;
public:
static int getX() {return x;}
};
//globals.cpp
#include "Globals.h"
int Globals::x = 1;
//main.cpp
#include "Globals.h"
//x is initialized before call to main
int main()
{
int x = Globals::getX();
}
答案 1 :(得分:2)
我称之为“过时”。它基本上使用class
(或struct
,视情况而定)来模拟namespace
。
class whatever {
static int a, b, c;
static double x, y, z;
};
int whatever::a, whatever::b, whatever::c;
double whatever::x, whatever::y, whatever::z;
几乎与:
相同namespace whatever {
int a, b, c;
double x, y, z;
}
您可能只是处理已添加到语言中的namespace
之前的代码。如果它不是那么老,那么作者可能是,或者可能有一些意图维持一些不支持namespace
(正确)的编译器的可移植性。
在任何情况下,您拥有的是具有限定名称的全局变量。即使它们位于class
/ struct
内,static
也意味着它们具有静态生命周期,因此作为结构只会影响名称,而不会影响初始化或破坏。