说我有一个班级定义:

class CustomClass {
    int member;
};

为什么以下变量定义正在编译并正常工作:

CustomClass CustomClass; // the variable is properly constructed

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

有帮助吗?

解决方案

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

其他提示

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

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

如果您尝试类似

的话
#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'将无法编译,但在全局'测试'被注释后,同样在'main()'内部工作。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top