为什么C++中的ClassName ClassName变量定义可以编译并正常工作?

问题描述 投票:0回答:5

假设我有一个类定义:

class CustomClass {
    int member;
};

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

CustomClass CustomClass; // the variable is properly constructed

这不会让编译器感到困惑并导致它指示错误吗?

c++ definition
5个回答
10
投票

类名和变量名占据两个独立的命名空间。 编译器能够识别出第一个

CustomClass
是类型,第二个
CustomClass
是变量名。


1
投票

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


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++ 的复杂性足以让程序员兴奋,那么编译器也能做出贡献怎么样?:-)


0
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.