正如我们所知,可以在类结构中初始化整型常量静态成员。当在类结构中使用常量时,例如,它可以用作int数组的大小。 看代码如下:为什么我们必须定义一个在类中初始化的const静态成员
class MyClass{
static const int num = 100;
int elems[num];
...
};
但是,我们仍然需要定义类定义之外成员NUM:
const int MyClass::num;
我不知道为什么我们要做这样的。 有人能告诉我为什么吗? 非常感谢。
另外,我写了下面的代码:
#include <iostream>
using namespace std;
class MyClass{
public:
MyClass()
{
cout << "instruct class MyClass!" << endl;
}
static const int num = 100;
int elems[num];
};
//const int MyClass::num;
int main()
{
MyClass a;
const int *b = &(a.num);
cout << "&(a.num): " << &(a.num) << endl;
cout << "a.num: " << a.num << endl;
cout << "*b: " << *b << endl;
}
它运行良好的Visual Studio 2008中:
但我已删除的代码,明确成员NUM课外。
我很困惑。有人能为我解释吗?
但是编译器可以像处理静态成员模板或内联函数一样处理它,它们都具有多个文件中的定义,但仍然需要一个地址。 – 2012-03-20 11:54:11
@JamesKanze:对于模板的静态成员,您仍然需要一个实际上非常烦人的定义,因为隐式实例化不适用于此。我猜,它可以像内联函数中的静态变量那样工作。我的理解是,这些工作通过创建带有弱符号的函数来实现,并在链接时被丢弃。但是,该语言目前需要定义,尽管编译器可能不会坚持它的存在。 – 2012-03-20 12:03:22
我知道。我只是说在技术上,不要求定义不成问题,因为支持不需要的编译器技术在其他环境中也是必需的。 – 2012-03-20 12:21:16