C++:通过类或实例访问const成员变量?

cri*_*ell 3 c++ static const

在C++中,有没有理由不通过类实例访问静态成员变量?我知道Java对此皱眉,并想知道它是否在C++中很重要.例:

class Foo {
  static const int ZERO = 0;
  static const int ONE = 1;
  ...
};


void bar(const Foo& inst) {
   // is this ok?
   int val1 = inst.ZERO;
   // or should I prefer:
   int val2 = Foo::ZERO
   ...
};
Run Code Online (Sandbox Code Playgroud)

我有第二个问题.如果我声明一个静态double,我必须在某处定义它,并且该定义必须重复该类型.为什么必须重复这种类型?例如:

In a header:
  class Foo {
    static const double d;
  };
In a source file:
  const double Foo::d = 42;
Run Code Online (Sandbox Code Playgroud)

为什么我必须在cpp文件中重复"const double"部分?

Reu*_*nen 6

我更喜欢Foo::ZERO,inst.ZERO因为它更清楚地告诉我们发生了什么.但是,在课堂方法中Foo,我只会使用ZERO.

至于奖金问题,const只是完整类型的一部分.


qua*_*ark 5

对于第一个问题,除了风格问题(它显然它是一个类变量并且没有相关对象),Fred Larsen在对问题的评论中提到了前面的问题.阅读亚当罗森塔尔的回答非常好的理由,为什么你要小心这一点.(如果弗雷德将其作为答案发布,我会对其进行投票,但我不能相信它应该归还的地方.我向亚当投票了.)

至于你的第二个问题:

为什么我必须在cpp文件中重复"const double"部分?

您必须主要重复该类型作为实现细节:它是C++编译器解析声明的方式.这对于局部变量也不是非常理想的,并且C++ 1x(以前称为C++ 0x)使用auto关键字来避免需要对常规函数变量重复.

所以这:

vector<string> v;
vector<string>::iterator it = v.begin();
Run Code Online (Sandbox Code Playgroud)

可以成为这样:

vector<string> v;
auto it = v.begin();
Run Code Online (Sandbox Code Playgroud)

没有明确的理由为什么这也不适用于静态,所以在你的情况下thos:

const double Foo::d = 42;
Run Code Online (Sandbox Code Playgroud)

很可能成为这个.

static Foo::d = 42;
Run Code Online (Sandbox Code Playgroud)

关键是要有一些方法将此识别为声明.

请注意我说没有明确的理由:C++的语法是一个活着的传奇:它是非常难以涵盖其所有的边缘情况.我不认为上述内容是模棱两可的,但可能是.如果不是,他们可以将其添加到语言中.告诉他们...对于C++ 2x:/.