2009-04-30 43 views
1

对不起,如果这个问题在这里似乎很微不足道。在C++中对一个类的静态成员变量的查询

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

class Foo 
{ 
public: 
    static int bands; 
    ... 
    ... 
private: 
    ... 
    ... 

}//class definition ends 

int Foo::bands; //Note: here its not initialized to any value! 
  1. 为什么需要再次上面的语句时,“带”类静态内部一次申报?

  2. 也可以将一个静态变量声明为任何类中的私有成员变量?

+0

这不是在这种情况下需要。你是否想让乐队变得静止? – jalf 2009-04-30 13:23:47

回答

5

C++注意到声明之间的区别定义为bands在类中声明,但未定义。

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

2

a)它是必需的,因为这是languge的设计方式。 b)静态变量由其默认构造函数初始化,或者为内置类型初始化为零。

c)是的,他们可以(通常是)私人的。

0

它与OBJ文件,它们是如何用来做什么,和内存如何在全球范围的地址变量是通过连接过程最终发现。目标文件包含在相应cpp中定义的所有全局数据和函数的地址。他们以相对的方式布置一些内存,告诉liker在这个文件中可以找到这些全局变量/ funcs的位置。因此,例如,

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 

的 “外部” 关键字状态,这个名字是有效的,其地址会在链接时解决。每个包含“foo.h”并想使用“band”全局变量的人都可以使用它。在链接时,链接器会找出foo.obj中存在的频段。如果你忘记在foo.obj中加入“int bands”,你会得到一个链接器错误,并且必须去解决它。

在C++中使用静态类声明我相似。你告诉用户存在这个叫做“foo :: bands”的东西,它的存在将在链接时解决。后来下了线,链接器发现,在foo.obj,FOO ::带存在,所有引用到foo ::带就可以解决。

0

我的理解是,你只需要,如果你打算使用它之前就已经创建类的实例来声明美孚::带。基本上,当你在一个C++类中声明一个静态的时候,那个类的所有实例只存在该变量的一个副本。但是,在声明类的实例之前,您通常无法访问Foo :: band。

例如:

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); 
} 
+1

你的理解是错误的。即使没有创建类实例,该静态变量也会存在。 – 2009-04-30 13:53:33

相关问题