访问类的成员。这个类的对象从未实例化过。所有成员都是静态类型

时间:2012-05-03 18:06:07

标签: c++ static

我有一个工作的代码库,它有一个名为Tabs的类。此类的所有方法和变量都定义为static。我知道类的静态成员由该类对象的所有实例共享。此类用于将某些类型的数据存储为集合。许多不同的文件使用成员函数Tabs :: find()和Tabs :: Insert()而不会实例化类Tabs的对象。我试图理解这是如何工作的以及这种编程技术的名称。感谢。

2 个答案:

答案 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也意味着它们具有静态生命周期,因此作为结构只会影响名称,而不会影响初始化或破坏。