在 C++ 中查询类的静态成员变量

Posted

技术标签:

【中文标题】在 C++ 中查询类的静态成员变量【英文标题】:Query on Static member variables of a class in C++ 【发布时间】:2009-04-30 13:17:31 【问题描述】:

对不起,如果这个问题对这里的许多人来说似乎微不足道。

在 C++ 代码中有如下内容:

class Foo

public:
   static int bands;
   ...
   ...
private:
   ...
   ...

//class definition ends

int Foo::bands; //Note: here its not initialized to any value!

    当“bands”在类中声明为静态时,为什么再次需要上述语句?

    静态变量也可以在任何类中声明为私有成员变量吗?

【问题讨论】:

这种情况下不需要。您的意思是让乐队静态化吗? 【参考方案1】:

C++ 指出了声明定义之间的区别。 bands 在类中声明,但未定义。

当您定义该类型的对象时,将定义一个非静态数据成员,但由于静态成员不是任何特定对象的一部分,它需要它自己的定义。

【讨论】:

【参考方案2】:

a) 它是必需的,因为这是语言的设计方式。

b) 静态变量由它们的默认构造函数初始化,或者对于内置类型初始化为零。

c) 是的,它们可以(并且通常是)私有的。

【讨论】:

【参考方案3】:

看看this question.

【讨论】:

【参考方案4】:

它与 obj 文件、它们的使用方式以及如何通过链接过程最终发现全局范围变量的内存地址有关。目标文件包含相应 cpp 中定义的所有全局数据和函数的地址。他们以相对的方式布局一些内存,以告诉喜欢者在该文件中的何处可以找到这些全局变量/函数。比如

function doFoo can be found 0 bytes from beginning of this file
int foo::bands can be found 12 bytes from beginning of this file
etc

如果你以前做过直接的 C,这几乎更容易思考。在纯 C 世界中,您将在更传统的模块化编程意义上做事。您的模块将使用标头和 cpp 定义。标头将使用 extern 关键字定义如下所示的“公共”变量,然后在 cpp 中实例化它。

foo.h

extern int bands; 

foo.cpp

#include "foo.h"
int bands;

foo.obj:

int bands can be found 0 bytes from the beginning of this file

“extern”关键字表明此名称有效,其地址将在链接时得到解析。每个包含“foo.h”并想使用“bands”全局变量的人现在都可以使用它。在链接时,链接器 会发现 foo.obj 中存在带。如果您忘记在 foo.obj 中添加“int Bands”,则会收到链接器错误,并且必须去解决它。

在 C++ 中,在类声明中使用静态是类似的。您是在告诉用户存在一个名为“foo::bands”的东西,它所在的位置将在链接时得到解决。稍后,链接器看到 foo.obj 中存在 foo::bands,并且所有对 foo::bands 的引用都可以解析。

【讨论】:

【参考方案5】:

我的理解是,如果您计划在创建类的实例之前使用它,则只需要声明 Foo::bands。基本上,当您在 C++ 类中声明一个静态变量时,该类的所有实例都只存在该变量的一个副本。但是,在声明类的实例之前,您通常无法访问 Foo::bands。

例如:

Pointers to Members

#include <iostream>
using namespace std;

class X 
public:
  int a;
  void f(int b) 
    cout << "The value of b is "<< b << endl;
  
;

int main() 

  // declare pointer to data member
  int X::*ptiptr = &X::a;

  // declare a pointer to member function
  void (X::* ptfptr) (int) = &X::f;

  // create an object of class type X
  X xobject;

  // initialize data member
  xobject.*ptiptr = 10;

  cout << "The value of a is " << xobject.*ptiptr << endl;

  // call member function
  (xobject.*ptfptr) (20);

【讨论】:

你的理解是错误的。即使没有创建任何类实例,静态变量也会存在。 对不起,我不清楚,我的意图不是暗示该变量不存在 - 只是在创建类的实例之前它通常是不可访问的(例如通过类指针指向数据成员),因此他只需要制作 int Foo::bands;如果他计划在创建类的任何实例之前访问变量,则声明。

以上是关于在 C++ 中查询类的静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章

C++ 静态成员变量成员函数

C++中类里面定义 静态成员变量的问题

C++ 类中的静态成员变量,静态成员函数

类的静态变量

c++类中 各种成员的生命周期?

C++类静态成员变量作用域共享问题