考虑以下代码:
#include<iostream>
using namespace std;
class Wilma
{
public:
static int i;
Wilma()
{
cout<<"\nWilma ctor\n";
cout<<"\ni::"<<i<<"\n";
}
};
class Fred
{
public:
Fred()
{
cout<<"\nFred ctor\n";
}
static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
int a=0;
Wilma::i=a;//---------- LINE C
Wilma w;
Fred::wilma_=w;//---------- LINE B
}
这行A显式定义了Wilma类的静态int(注释导致链接器错误)
并且没有链接器,则给出 undefined reference 错误。(因为实际上正在使用Wilma::i,如果我不使用它,则不存在链接器错误。)
对于Fred类的静态Wilma wilma_应该也是如此,也就是说,也应该明确定义它。因为在行B的代码中也使用了它。
但是事实并非如此,如果未明确定义Fred::wilma_,则不会发生链接器错误。
为什么?
在gcc 4.5.2上测试
编辑:
我对此又有一个疑问...
LINE C 和 LINE B 都试图分别使用类的静态对象
int Wilma::i
和Wilma Fred::wilma_
。但是只有
int Wilma::i
的定义是强制性的吗?为什么不是
Wilma Fred::wilma_;
是强制性的?我理解 B行是没有操作的答案。但是关于 C行也可以这样说吗?
最佳答案
Wilma
没有非静态字段。 Fred::wilma_=w;
不执行任何操作。
编辑
如果没有非静态成员,则没有副本。基本上,该分配是无操作的,可能只是由编译器进行了优化,而链接器却从未看到过。添加一个非静态成员会使该副本成为引用静态变量的实际操作,因此编译器无法对其进行优化,并且链接程序可以对其进行查看。