考虑这段代码:
#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 类的 static int a。(注释掉导致链接器错误) 没有它,链接器会给出 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;
什么都不做。
编辑
如果没有非静态成员 - 则没有拷贝。基本上这个赋值是一个空操作,可能只是被编译器优化掉了,而链接器从来没有看到它。添加非静态成员会使拷贝成为引用静态变量的实际操作,因此编译器无法优化它,链接器会看到它。
关于c++ - 静态成员显式定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670284/