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

C++中类静态成员变量的查询,c++,class,variables,static,C++,Class,Variables,Static,对不起,如果这个问题对这里的很多人来说都是微不足道的 在C++代码中有如下内容: class Foo { public: static int bands; ... ... private: ... ... }//class definition ends int Foo::bands; //Note: here its not initialized to any value! 当“bands”曾经在类中声明为static时,为什么还需要上面的语句 静态变量

对不起,如果这个问题对这里的很多人来说都是微不足道的

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

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

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
当“bands”曾经在类中声明为static时,为什么还需要上面的语句

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


a这是需要的,因为这就是语言的设计方式

静态变量由其默认构造函数初始化,对于内置类型则初始化为零


是的,它们可以而且通常是私有的。

a这是必要的,因为这就是语言的设计方式

静态变量由其默认构造函数初始化,对于内置类型则初始化为零


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

c++注意到声明和定义之间的区别。标注栏在类中声明,但未定义


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

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


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

看一看

这与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.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++中使用静态类声明类I。您告诉用户存在一个叫做foo::bands的东西,它将在链接时被解析。接下来,链接器会看到foo.obj中存在foo::bands,并且可以解析对foo::bands的所有引用。

这与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.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++中使用静态类声明类I。您告诉用户存在一个叫做foo::bands的东西,它将在链接时被解析。接下来,链接器会看到foo.obj中存在foo::bands,并且可以解析对foo::bands的所有引用。

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

例如:


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

例如:


在那种情况下不需要它。你的意思是让乐队静止吗?那样的话就不需要了。你的意思是使乐队静止吗?你的理解是错误的。即使没有创建任何类实例,静态变量也会存在。很抱歉,我不清楚,我的意图不是暗示该变量不存在-只是在创建类实例之前(例如通过指向数据成员的类指针),静态变量通常是不可访问的,因此他只需要使用int Foo::bands;声明他是否计划在创建类的任何实例之前访问变量。您的理解是错误的。即使没有创建任何类实例,静态变量也会存在。很抱歉,我不清楚,我的意图不是暗示该变量不存在-只是在创建类实例之前(例如通过指向数据成员的类指针),静态变量通常是不可访问的,因此他只需要使用int Foo::bands;声明他是否计划在创建类的任何实例之前访问变量。