我正在遵循一些简单的示例来加深我对私有静态成员的理解。但是,我遇到了编译错误。
以下是示例,我正在关注-
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()中定义它,但是它不起作用。它需要是全球性的,我不知道为什么它需要是全球性的?我认为这与私人/公共无关。请在这里澄清我的疑问。
答案 0 :(得分:2)
为什么必须在main()之外定义它?它也可以与私人合作。但是,不能在main函数中定义它。我的理解是,类内部的static int只是一个声明。它需要在某个地方定义。我在main()中定义它,但是它不起作用。它需要是全球性的,我不知道为什么它需要是全球性的?我认为这与私人/公共无关。请在这里澄清我的疑问。
是的,类定义中的static int k;
实际上只是静态数据成员的声明,而不是定义。是的,您需要在某处提供静态数据成员的定义。该位置不能在main函数内,也不能在此函数内。是的,这与私人与公共无关。这就是可以在其中定义静态数据成员的地方。静态数据成员的定义(未内联定义)必须驻留在包含类定义的名称空间范围内。因为C ++语言的规则是这样说的(特别是在[class.static.data]/2中)。全局名称空间就是一个可以定义静态数据成员的地方……