오늘 문제가 생겼습니다. static
멤버 함수 가 필요 const
합니다. 필수가 아니라 더 좋습니다. 그러나 나는 노력에 성공하지 못했습니다. 아무도 왜 또는 어떻게 말할 수 있습니까?
오늘 문제가 생겼습니다. static
멤버 함수 가 필요 const
합니다. 필수가 아니라 더 좋습니다. 그러나 나는 노력에 성공하지 못했습니다. 아무도 왜 또는 어떻게 말할 수 있습니까?
답변:
const
비 정적 멤버 함수에 한정자를 적용 하면 this
포인터에 영향을줍니다 . class의 const 정규화 된 멤버 함수의 C
경우 this
포인터는 형식 C const*
인 반면 const 정규화되지 않은 멤버 함수의 경우 this
포인터는 형식 C*
입니다.
정적 멤버 함수에는 this
포인터 가 없으므로 (이러한 함수는 클래스의 특정 인스턴스에서 호출되지 않음) 정적 멤버 함수의 const 한정은 의미가 없습니다.
const
으로 정적 멤버와 비 정적 멤버 의 의미가 동일해야 한다고 가정합니다 . 그 생각이 유지되지 않는 예를 들어 static
문맥에 따라 의 의미를 고려하십시오 .
C const*
또는 const C*
?
귀하의 질문에 동의하지만 불행히도 C ++는 그렇게 설계되었습니다. 예를 들면 :
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
오늘 const
부터는 this
. 어떤면에서는 좁습니다. 이것을 포인터 const
너머로 적용하면 더 넓게 만들 수 있습니다 this
.
즉, 기능 const
에도 적용될 수 있는 "제안 된" static
은 static
회원의 수정을 제한합니다 .
예제 코드에서 foo()
만들 수있는 경우 const
해당 함수에서 A::s
수정할 수 없습니다. 이 규칙이 표준에 추가되면 언어 부작용을 볼 수 없습니다. 반대로, 그러한 규칙이 존재하지 않는 이유가 재미 있습니다!
const
개체에 적용됩니다 (const 멤버 함수의 경우 호출되는 인스턴스). 클래스의 모든 정적 구성원에게 적용하고 싶을 때위원회에서 고려한다면 지원할 충분한 공통 요구 사항으로 간주되지 않았을 것입니다.
const
개질제 멤버 메소드 또는 멤버 변수에 적용되지만 암시는 없다 this
-pointer. 정적 멤버 메서드는 개체에 바인딩되어 있지 this
않으므로 만들 포인터 가 없습니다 const
.
세부 사항을 다루지 않고 함수에 의해 수정 된 객체가있을 수도 있고 없을 수도 있기 때문에 const는 컴파일러에게 모호합니다.
리콜 const
유지 상수 객체 만, 또는 일정하게 유지하기 위해 여기 객체가 될 수도 있고 그렇지 않을 수도 있습니다.
this
포인터를. (이 외에도, const
. 그것은 개체를 수정하는 데 사용되는 특정 포인터 나 참조를 방지 객체를 일정하게 유지하지 않지만, 수정은 또 다른 경로를 통해 발생할 수)
C ++가 설계에 따라이를 받아들이지 않는 것은 유감이지만 논리적으로 제대로 검증되는 사용 사례가 거의 없습니다.
클래스 수준 유효 (정적) 인 함수는 정적 데이터를 변경하지 않을 수 있습니다. 쿼리 데이터는 const 여야합니다. 다음과 같아야 할 수도 있습니다.
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
const
정적 멤버 함수는 무엇을 의미합니까?