类中的静态成员

时间:2014-04-11 02:51:28

标签: c++ static

我对类中的静态和静态const变量有疑问。

特别好奇静态和静态const的内存状态。

在以下代码中,

#include <iostream>
using namespace std;

class test{
public:
    static const int testConstStatic =1;
    static int testStatic;
};

int test::testStatic = 0;

int main(){

  cout << test::testStatic << endl;
  cout << test::testConstStatic << endl;
  return 0;
}

为什么'static int testStatic'需要使用定义,如果没有,我得到关于testStatic的'未定义引用'?

这个定义是否与testStatic建立了联系?

那么testConstStatic呢?

提前致谢!

已更新!

这个问题的主要原因是,当我将静态变量声明为全局且肯定未定义并打印输出时,没有关于'未定义引用'的消息但是对于CLASS中的静态变量没有definitino它会显示消息'undefined reference'< / p>

#include <iostream>
using namespace std;

static int testStaticInGlobal;

class test{
public:
        static int testStatic;
};

int test::testStatic = 0;

int main(){

      cout << test::testStatic << endl;  // 'Undefined reference' error without definition
      cout << testStaticInGlobal << endl; // no error without definition

      return 0;
}

谢谢!

4 个答案:

答案 0 :(得分:4)

必须在使用前定义C ++中的所有变量。此定义的发生方式取决于变量的类型。

  • 对于非static类成员变量,该定义可能由类的构造函数(它本身可能是隐含的)隐式执行。
  • 由于static变量根据定义不是由构造函数初始化的,因此static成员变量必须始终具有明确的定义。
  • 为方便起见,C ++允许将static const成员的定义与其声明结合起来,就像您所做的那样,under certain circumstances。从概念上讲,static const int testConstStatic = 1;做了两件不同的事情:声明testConstStatic成员,将其定义为值1。无论出于何种原因,语言设计人员都不会选择将这两个步骤合并为非const static成员。

顺便说一句(为了解决Ed Heal的评论),必须定义非static const成员(与任何非static成员变量一样)在建造物体;构造完成后它不会改变,但是对于每个类的实例,它可能具有不同的值,这与static const成员不同,{{1}}成员在程序的整个持续时间内始终只有一个值。 / p>

答案 1 :(得分:3)

static const int成员是一个特例。在大多数用法中,它们被视为编译时常量,因此不需要它们的存储位置。唯一的例外是当您尝试创建指向此变量的指针或引用时,它需要一个可以存在的位置,并且您需要提供定义。

答案 2 :(得分:0)

静态成员变量需要在类外定义。这是一条规则。

C ++ 11以后,const静态成员通常不必在课堂外定义。

静态数据成员被视为在对象实例之间共享的全局变量,因此它们只能被定义一次,并且安全下注在类之外。

答案 3 :(得分:-1)

const变量按定义是静态的。因此static中的static const是多余的。即只需const即可。

static需要static int,因为没有它,变量是一个普通的非静态成员变量,只为实例定义。