2

假设我有一个类定义:

class CustomClass {
    int member;
};

为什么以下变量定义可以正确编译和工作:

CustomClass CustomClass; // the variable is properly constructed

这不应该混淆编译器并导致它指示错误吗?

4

5 回答 5

10

类名和变量名占据两个独立的命名空间。编译器能够确定第一个CustomClass是类型,第二个CustomClass是变量名。

于 2009-05-06T05:18:29.103 回答
1

所要求的疑问不一定与 C++ 的区分大小写模式有关,而是与上面定义的类同名的变量声明。我认为您的 c++ 编译器足够聪明,可以推断出它正在解析的令牌的类型..

于 2009-05-06T05:20:37.787 回答
0

我认为它的编译器魔法使它工作。我同意你的观点,理想情况下这应该是一个编译器错误(至少让我感到困惑)。

如果你尝试类似

#include <iostream>
class Test { public: int member; };
Test Test;   // comaeu warns 'expression has no effect!'
Test.member = 10; // dosen't compile!

int main(){
  Test Test;   
  Test.member = 10; // compiles fine after global 'Test's are commented!!
  std::cout<<Test.member<<std::endl;
  return 0;
}

在全局范围内使用“Test.member”不会编译,但在两个全局“Test”都被注释后,在“main()”中同样有效。

C++ 有足够的复杂性来激发程序员,编译器也有贡献吗:-)?

于 2009-05-06T05:42:45.533 回答
0

这个答案间接说明了可以在 C++ 中执行此操作的主要原因。它归结为与 C 的向后兼容性。在 C 中,类型具有不同的命名空间,因此可以声明类型和对象,或者具有相同名称的类型和函数。

为了与 C 兼容,C++ 添加了一些特殊规则,允许对象或函数隐藏类型的声明。

于 2009-05-06T12:52:10.603 回答
0

当然,为什么不呢?现在如何再次定义类CustomClass?简单:使用关键字“class”,像这样:class;类 CustomClass CustomClassAgain;

于 2009-06-23T13:51:02.283 回答