C ++에서 ClassName ClassName 변수 정의가 올바르게 작동하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/828106

문제

수업 정의가 있다고 말합니다.

class CustomClass {
    int member;
};

다음 변수 정의가 올바르게 컴파일되고 작동하는 이유 :

CustomClass CustomClass; // the variable is properly constructed

이것이 컴파일러를 혼동하고 오류를 나타내지 않아야합니까?

도움이 되었습니까?

해결책

클래스 이름과 변수 이름은 두 개의 개별 네임 스페이스를 차지합니다. 컴파일러는 첫 번째 CustomClass 유형이고 두 번째 유형입니다 CustomClass 변수 이름입니다.

다른 팁

요청 된 의심은 반드시 C ++의 사례 민감한 모드에 관한 것이 아니라 위에서 정의 된 클래스와 동일한 이름을 가진 변수 선언입니다. C ++ 컴파일러가 구문 분석하고 있다는 토큰의 유형을 추론 할만 큼 똑똑하다고 생각합니다.

컴파일러 마법이 작동한다고 생각합니다. 이 이상적으로 컴파일러 오류가되어야한다는 데 동의합니다 (Attleast를 혼란스럽게합니다).

당신이 같은 것을 시도한다면

#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;
}

글로벌 범위에서 '테스트. 멤버'를 사용하는 것은 컴파일되지 않지만 글로벌 '테스트가 모두 주석을 달린 후'main () '내부의 동일한 작품입니다.

C ++는 프로그래머를 자극하기에 충분한 복잡성을 가지고 있습니다. 컴파일러는 어떻습니까 :-)?

이것 대답은 간접적으로 C ++에서이를 수행 할 수있는 주된 이유를 나타냅니다. C에서 C와의 역 호환성이 다른 네임 스페이스를 가졌으므로 유형과 객체, 또는 동일한 이름의 유형 및 기능을 선언 할 수있었습니다.

C와 호환되기 위해 C ++는 객체 나 함수가 유형의 선언을 숨길 수 있도록 몇 가지 특수 규칙을 추가했습니다.

물론, 왜 안돼? 이제 클래스 CustomClass를 다시 정의하는 방법은 무엇입니까? 쉬운 : 다음과 같이 키워드 "클래스"를 사용합니다 : 클래스; 클래스 CustomClass CustomClassAgain;

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top