【发布时间】:2015-07-09 08:33:02
【问题描述】:
我的问题源于对 Scott Meyers 的 Effective C++ 的研究。 在那本书的第二条中,写了以下内容:
要将常量的范围限制为类,您必须将其设为成员,并且为了确保最多有一个常量副本,您必须将其设为静态成员。
写的很对。然后立即给出以下示例:
class GamePlayer {
private:
static const int NumTurns = 5;
int scores[NumTurns];
....
};
那么下面就是上面例子的写法:
您在上面看到的是声明,而不是 NumTurns 的定义。
我的第一个问题是:这句话是什么意思?
紧接着提到以下内容:
通常 C++ 要求您为使用的任何内容提供定义,但静态和整数类型(例如 - 整数、字符、布尔值)的类特定常量是一个例外。只要你不取他们的地址,你可以在不提供定义的情况下声明和使用它们。如果您确实获取了类常量的地址,或者即使您不获取地址,编译器也错误地坚持定义,您可以提供一个单独的定义,如下所示:
const int GamePlayer::Numturns; //definition of NumTurns
为什么现在是定义而不是声明?
我理解函数上下文中的差异,但不理解常规变量上下文中的差异。另外,有人可以通过
来扩展作者的意思吗... 如果您确实获取了类常量的地址,或者如果您的 .. 上面引用的段落的一部分?
P.S : 我是 C++ 的新手。
【问题讨论】:
-
这本书肯定解释了这一点......另外,快速谷歌搜索带来了这篇解释得很好的文章:cprogramming.com/declare_vs_define.html
-
@Amxx 是的,好点。这也是一个格式非常好的问题。 +1。
-
这与odr rules 相关,如果一个变量没有被 odr 使用,那么它就不需要类外定义。
-
我喜欢将在类中初始化的静态数据成员称为“带有初始化程序的声明”。它们从来都不是定义。
标签: c++