2010-02-25 6 views
4

정적 키워드가 필요한 이유는 무엇입니까?C++ 클래스 멤버 함수에 '정적'이 있습니까?

컴파일러가 왜 정적인지 아닌지를 추측 할 수 없습니까?

는 다음과 같이

내가 비 정적 멤버 데이터에 액세스하지 않고이 기능을 컴파일 할 수 있습니까? 예 -> 정적 기능. 아니오 -> 비 정적 기능.

유추하지 않은 이유가 있습니까?

답변

7

컴파일러가 정적인지 아닌지를 결정할 때 컴파일러에서 메서드 서명을 정의하는 헤더 파일과 연결된 외부 원본 파일에 어떤 영향을 줍니까?

+1

+1 스팟 온 응답 ..... –

1

예 그렇지만 컴파일러는 의도 한 바를 모릅니다. 원래 설계자는 의도를 제공하는 것이 중요하다고 생각했을 것입니다.

0

이와 같은 언어로 중복성을 사용하면 많은 프로그래머 오류가 컴파일러에 의해 잡히게됩니다.

0

또 다른 이유는 함수가 정적 인 경우 파생 클래스에서 재정의 할 수 없습니다. 다형성 없음.

+0

그건 정적이 아니라 가상입니다. std :: fstream :: rdbuf는 정적 클래스 멤버와 비 정적 멤버 멤버 모두 파생 클래스에 의해 숨길 수 있습니다. –

+0

@Roger : 그는 멤버 변수에 액세스하지 않는 메서드가 컴파일러에 의해 정적으로 선언되지 않는 이유를 묻습니다. 나는 가상 메소드가 멤버 변수에 액세스 할 수도 액세스하지 않을 수도 있다고 말하고 있지만, 컴파일러가 자동으로 정적 변수를 선언하지 않기를 바랄 것이다. –

+0

가상 메소드는 단순히 가상 적이기 때문에 항상 멤버 변수에 대한 액세스를 의미합니다. 즉, vtable. 그리고 암시 적 가상이 아닌 암시적인 정적에 대해서만 이야기하기 때문에 가상으로 표시된 모든 메소드는 자동 분류를 정적으로 사용할 수 없습니다. –

4

static 또는 non-static의 특성은 함수 유형에 영향을줍니다. 비 정적 멤버 함수는 암시 적으로 this 매개 변수를 가지지 만 정적 매개 변수 멤버는 그렇지 않습니다.

즉 정적 및 비 정적 멤버 함수간에 질적으로 큰 차이가 있습니다. 컴파일러는 이것을 "추론"할 수 없습니다. 이것은 저자 의도의 문제입니다.

내 함수가 정적이 아니길 원한다면 클래스의 비 정적 멤버에 액세스하지 않아도 비 정적으로 만듭니다. 컴파일러가 클래스의 비 정적 멤버에 액세스하지 않기 때문에 정적이 아닌 함수를 정적으로 만들기로 suddently 결정하면 일반적으로 코드의 기능이 손상됩니다.

관련 문제