私有静态成员-编译错误?

时间:2019-03-25 02:02:29

标签: c++

我正在遵循一些简单的示例来加深我对私有静态成员的理解。但是,我遇到了编译错误。

以下是示例,我正在关注-

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.cbclx01/cplr038.htm

已更改了c ++版本,以查看是否与c ++版本有关。

class test1
{
  static int i;
  static int j;
  static int k;
  static int f() { return 0;}
  int p;

public:
   test1()
   {
     p = 0;
   }
};

int main(void)
{
  test1 t;
  int test1::i = test1::f();
  int test1::j = test1::i;
  return 0;
}

编译此代码-

为什么这里失败,而示例链接说它可行。

$g++ -std=c++14  t1.cpp -o t1.out
t1.cpp: In function ‘int main()’:
t1.cpp:19:16: error: qualified-id in declaration before ‘=’ token
   int test1::i = test1::f();
                ^
t1.cpp:20:16: error: qualified-id in declaration before ‘=’ token
   int test1::j = test1::i;

如果我这样做的话-

class test1
{
  static int i;
  static int j;
  static int k;
  static int f() { return 0;}
  int p;

public:
   test1()
   {
     p = 0;
   }
};

int test1::i = test1::f();
int test1::j = test1::i;

int main(void)
{
  test1 t;
  return 0;
}

为什么必须在main()之外定义它? 它也可以与私人一起使用。但是,不能在main函数中定义它。我的理解是,类内部的static int只是一个声明。它需要在某个地方定义。我在main()中定义它,但是它不起作用。它需要是全球性的,我不知道为什么它需要是全球性的?我认为这与私人/公共无关。请在这里澄清我的疑问。

1 个答案:

答案 0 :(得分:2)

  

为什么必须在main()之外定义它?它也可以与私人合作。但是,不能在main函数中定义它。我的理解是,类内部的static int只是一个声明。它需要在某个地方定义。我在main()中定义它,但是它不起作用。它需要是全球性的,我不知道为什么它需要是全球性的?我认为这与私人/公共无关。请在这里澄清我的疑问。

是的,类定义中的static int k;实际上只是静态数据成员的声明,而不是定义。是的,您需要在某处提供静态数据成员的定义。该位置不能在main函数内,也不能在此函数内。是的,这与私人与公共无关。这就是可以在其中定义静态数据成员的地方。静态数据成员的定义(未内联定义)必须驻留在包含类定义的名称空间范围内。因为C ++语言的规则是这样说的(特别是在[class.static.data]/2中)。全局名称空间就是一个可以定义静态数据成员的地方……