考虑以下代码:

#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::iWilma Fred::wilma_
但是只有int Wilma::i的定义是强制性的吗?

为什么不是Wilma Fred::wilma_;是强制性的?

我理解 B行是没有操作的答案。但是关于 C行也可以这样说吗?

最佳答案

Wilma没有非静态字段。 Fred::wilma_=w;不执行任何操作。

编辑

如果没有非静态成员,则没有副本。基本上,该分配是无操作的,可能只是由编译器进行了优化,而链接器却从未看到过。添加一个非静态成员会使该副本成为引用静态变量的实际操作,因此编译器无法对其进行优化,并且链接程序可以对其进行查看。

08-16 00:14