'const'한정자로 정적 멤버 함수를 만들 수없는 이유


87

오늘 문제가 생겼습니다. static멤버 함수 가 필요 const합니다. 필수가 아니라 더 좋습니다. 그러나 나는 노력에 성공하지 못했습니다. 아무도 왜 또는 어떻게 말할 수 있습니까?


1
const정적 멤버 함수는 무엇을 의미합니까?
GManNickG 2011-08-12

2
@GMan은 입력을 변경하지 않는 정적 멤버 함수를 의미합니다.
prabhakaran 2011-08-12

11
그런 다음 입력 (함수 매개 변수)은 값 또는 상수 참조를 기준으로해야합니다.
GManNickG 2011-08-12

4
어쨌든 멤버 함수 인수의 상수에는 영향을 미치지 않습니다. 그것은 "모든 것을 const로 만든다"를 의미하는 것이 아니라 " const로 만든다"를 의미 합니다.
UncleBens

@GMan 당신은 그 CONST이 인수에 추가해야합니다 말
프라 바카

답변:


139

const비 정적 멤버 함수에 한정자를 적용 하면 this포인터에 영향을줍니다 . class의 const 정규화 된 멤버 함수의 C경우 this포인터는 형식 C const*인 반면 const 정규화되지 않은 멤버 함수의 경우 this포인터는 형식 C*입니다.

정적 멤버 함수에는 this포인터 가 없으므로 (이러한 함수는 클래스의 특정 인스턴스에서 호출되지 않음) 정적 멤버 함수의 const 한정은 의미가 없습니다.


'const'는 int, pointer 등과 같은 변수에만 적용된다는 의미입니까?
prabhakaran 2011-08-12

@prabhakaran-멤버 함수도 const 정규화 될 수 있습니다 . James는 그의 대답에서 그것을 분명히 언급했습니다.
Mahesh

@Mahesh Member 함수의 const 한정자도 전체가 아닌 'this pointer'만 한정합니다. const 정규화 된 멤버 함수 내에서 전역 변수를 변경할 수 있습니다. 이제 나는 이것을 확인했습니다.
프라 바카

5
-1 "정적 멤버 함수에는 this 포인터가 없습니다. 따라서 정적 멤버 함수의 const 한정은 [그런 식으로] 의미가 없습니다."는 그 자체로는 참이지만 질문의 "왜 ". 대답 const으로 정적 멤버와 비 정적 멤버 의 의미가 동일해야 한다고 가정합니다 . 그 생각이 유지되지 않는 예를 들어 static문맥에 따라 의 의미를 고려하십시오 .
건배와 hth. -Alf 2014

2
그것은인가 C const*또는 const C*?
crisron

24

귀하의 질문에 동의하지만 불행히도 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에도 적용될 수 있는 "제안 된" staticstatic회원의 수정을 제한합니다 .

예제 코드에서 foo()만들 수있는 경우 const해당 함수에서 A::s수정할 수 없습니다. 이 규칙이 표준에 추가되면 언어 부작용을 볼 수 없습니다. 반대로, 그러한 규칙이 존재하지 않는 이유가 재미 있습니다!


8
아마도 "이 함수는 전역 변수를 수정하지 않는다"는 의미로 자유 함수를 const-modify 할 수없는 이유와 같을 것입니다. const개체에 적용됩니다 (const 멤버 함수의 경우 호출되는 인스턴스). 클래스의 모든 정적 구성원에게 적용하고 싶을 때위원회에서 고려한다면 지원할 충분한 공통 요구 사항으로 간주되지 않았을 것입니다.
Steve Jessop 2011-08-12

1
const개질제 멤버 메소드 또는 멤버 변수에 적용되지만 암시는 없다 this-pointer. 정적 멤버 메서드는 개체에 바인딩되어 있지 this않으므로 만들 포인터 가 없습니다 const.
Ruud Althuizen

0

세부 사항을 다루지 않고 함수에 의해 수정 된 객체가있을 수도 있고 없을 수도 있기 때문에 const는 컴파일러에게 모호합니다.

리콜 const유지 상수 객체 만, 또는 일정하게 유지하기 위해 여기 객체가 될 수도 있고 그렇지 않을 수도 있습니다.


2
"할 수도 있고 아닐 수도 있습니다"? 정적 멤버 함수는 결코 이 없습니다 this포인터를. (이 외에도, const. 그것은 개체를 수정하는 데 사용되는 특정 포인터 나 참조를 방지 객체를 일정하게 유지하지 않지만, 수정은 또 다른 경로를 통해 발생할 수)
벤 보이트

0

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

0

'상수 멤버 함수'는 호출 된 개체를 수정할 수 없지만 정적 멤버 함수는 어떤 개체에서도 호출되지 않습니다. 범위 해결 연산자가 직접 사용합니다. 따라서 const 정적 멤버 함수를 갖는 것은 의미가 없으므로 불법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.