'const'한정자로 정적 멤버 함수를 만들 수없는 이유
오늘 문제가 생겼습니다. static
멤버 함수 가 필요 const
합니다. 필수가 아니라 더 좋습니다. 그러나 나는 노력에 성공하지 못했습니다. 아무도 왜 또는 어떻게 말할 수 있습니까?
const
비 정적 멤버 함수에 한정자를 적용 하면 this
포인터에 영향을줍니다 . class의 const 정규화 된 멤버 함수의 C
경우 this
포인터는 형식 C const*
이고 const 정규화되지 않은 멤버 함수의 경우 this
포인터 형식은입니다 C*
.
정적 멤버 함수에는 this
포인터 가 없으므로 (이러한 함수는 클래스의 특정 인스턴스에서 호출되지 않음) 정적 멤버 함수의 const 한정은 의미가 없습니다.
나는 귀하의 질문에 동의하지만 불행히도 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
유지 상수 객체 만, 또는 일정하게 유지하기 위해 여기 객체가 될 수도 있고 그렇지 않을 수도 있습니다.
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 정적 멤버 함수를 갖는 것은 의미가 없으므로 불법입니다.
'programing' 카테고리의 다른 글
Python [Errno 98] 이미 사용중인 주소 (0) | 2020.10.12 |
---|---|
Queryable.SelectMany () 메서드에 대한 C # LINQ 구문이 있습니까? (0) | 2020.10.12 |
파이썬에서 두 개의 정렬 된 목록을 어떻게 비교할 수 있습니까? (0) | 2020.10.12 |
.includes ()가 Internet Explorer에서 작동하지 않음 (0) | 2020.10.12 |
Jasmine에서 개체 평등 확인 (0) | 2020.10.11 |