1

在 TC++PL 中,作者说

当且仅当您以需要将其作为对象存储在内存中的方式使用初始化(静态)成员时,该成员必须在某处唯一定义。

但是,我不知道作为对象存储在内存中意味着什么。我猜这个静态成员已经在内存中,不管它的类的对象是否被实例化。为了您的信息,作者介绍了一个例子。

class Curious {
public:
    static const int cl = 7;
    ....
}
const int Curious::cl;

它看起来像某种实例化。但是,我不知道为什么它是必要的。我们可以直接访问 Curious::cl。

4

1 回答 1

3

现在,我们也假设它class Curious在一个头文件中,它包含在 6 个不同的源文件中(s1.cpp 到 s6.cpp 给它们一个名字)。

我们需要,出于某种“充分的理由”,获取cl...的地址

编译器应该把这个cl变量放在什么地方?请注意,当编译器完成它的工作时,它(通常)一次只能看到一个源文件,因此它不知道Curious类定义有多少次,因此static const int cl = 7;代码中已经发生了。所以它不能说“哦,我cl在 s1.cpp 中有一个,所以当我编译 s2.cpp ... s6.cpp 时,我不需要一个”。

换句话说,编译器需要您的帮助才能将其“放置”cl到目标文件中。

[这在嵌入式系统中可能会变得更加有趣,其中数据很可能位于内存的不同“部分”中,具体取决于您将其编译为哪个源文件,因此选择的内存cl可能会根据您使用的源文件而改变。在“更大”的计算机中,这不是什么问题,但是语言定义仍然不知道您将如何使用该语言,因此必须在可能重要的地方满足各种变体]。

于 2013-08-28T16:25:50.630 回答