在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"部分?
对于第一个问题,除了风格问题(它显然它是一个类变量并且没有相关对象),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:/.
| 归档时间: |
|
| 查看次数: |
6935 次 |
| 最近记录: |