嵌套 class 的静态对象可以在没有 class 定义的情况下声明
Static objects of nested class can be declared without class definition
除非定义了 class,否则无法声明 class 的静态对象...
例如..以下代码无法编译,因为class C 尚未定义....
class C;
int main()
{
static C y;
}
但是为什么在 class B 没有被定义的情况下,下面的代码仍然可以编译??
class A
{
class B;
static B x;
};
在第一种情况下(在 main
函数中)定义了对象 y
- 因此需要 class 定义。
在第二种情况下(在 class A
中)成员 x
仅被声明 - 它需要在 .cpp 文件中正常定义。就其定义而言,C
的定义是必需的,但它不适用于静态成员声明。
区别不在于一个 class 是内部 class 而另一个不是。区别在于 static
在 class 作用域和函数作用域中的含义不同。
在 class 范围内,它表示一个 class 范围(不是每个实例)的成员,该行是一个 声明 。您需要在 class 正文之外单独定义:
A::B A::x; // B must be complete here, and you can add an initializer
在函数范围内,它是一个静态存储持续时间的局部变量,这意味着它将在函数调用中保留其值。该行本身就是一个定义,而不仅仅是一个声明,因此它需要完整的类型。
A static object of a class cannot be declared unless the class has been defined...
不完全是。它不能被定义(或者实例化,如果你喜欢)除非class已经被定义(完整类型);只要声明了 class,它就可以 声明(但可能是 不完整类型,尚未定义)。
the following code does not compile as the class C has not been defined....
的确,它试图定义一个局部变量,这需要class定义。
But why does the following code compiles even though class B has not been defined??
因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)
A::B A::x;
此时类型必须完整(即已定义)。
除非定义了 class,否则无法声明 class 的静态对象...
例如..以下代码无法编译,因为class C 尚未定义....
class C;
int main()
{
static C y;
}
但是为什么在 class B 没有被定义的情况下,下面的代码仍然可以编译??
class A
{
class B;
static B x;
};
在第一种情况下(在 main
函数中)定义了对象 y
- 因此需要 class 定义。
在第二种情况下(在 class A
中)成员 x
仅被声明 - 它需要在 .cpp 文件中正常定义。就其定义而言,C
的定义是必需的,但它不适用于静态成员声明。
区别不在于一个 class 是内部 class 而另一个不是。区别在于 static
在 class 作用域和函数作用域中的含义不同。
在 class 范围内,它表示一个 class 范围(不是每个实例)的成员,该行是一个 声明 。您需要在 class 正文之外单独定义:
A::B A::x; // B must be complete here, and you can add an initializer
在函数范围内,它是一个静态存储持续时间的局部变量,这意味着它将在函数调用中保留其值。该行本身就是一个定义,而不仅仅是一个声明,因此它需要完整的类型。
A static object of a class cannot be declared unless the class has been defined...
不完全是。它不能被定义(或者实例化,如果你喜欢)除非class已经被定义(完整类型);只要声明了 class,它就可以 声明(但可能是 不完整类型,尚未定义)。
the following code does not compile as the class C has not been defined....
的确,它试图定义一个局部变量,这需要class定义。
But why does the following code compiles even though class B has not been defined??
因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)
A::B A::x;
此时类型必须完整(即已定义)。