2011-04-20 2 views

답변

3

컴파일러가 확실하지 않습니다. 도메인 변수가 이라는 언어로되어 있으므로 const 멤버 함수에서 변경을 할 수 없다는 규칙이 없기 때문에 그렇게 할 수 없습니다. 유일한 규칙은 const을 캐스팅하지 않고 this 포인터를 통해 상태를 변경할 수 없다는 것입니다.

+0

참조 : 9.3.2/2 –

+1

확인. 나는 의도적 인 것이 아니기 때문에 DR을 올릴 것이다. (또한 표준의 다른 많은 곳과 모순된다.) 당신은'mutable'을 수정할 수 있습니다 (그렇지 않으면, 무엇이 요점입니까?), 당신은 const를 버려두고, 존재할 수도있는 다른 비 const 포인터를 통해 객체를 명확하게 수정할 수 있습니다. –

+0

@James : 이러한 많은 활동은 정의되지 않은 동작을 초래합니다. –

3

C++의 경우 const 컴파일러의 논리를 통해 컴파일 타임에 확인이 수행됩니다. 함수에 const이라고 표시된 경우 멤버 변수가 변경되지 않습니다. 나는 그것이 실행 가능한 코드의 저장과 관련이 없다고 생각한다.

Java의 경우 동일한 const 패러다임이 있다는 것을 알지 못했습니다.

1

const 함수에서 멤버 변수를 직접 또는 간접적으로 수정하려고하면 C++ 컴파일러에서 오류를 플래그 지정합니다 (해당 변수가 변경 가능으로 표시되어 있지 않은 경우). 캐스트로이 문제를 해결할 수 있습니다. 컴파일러는 런타임에 constness를 강화하기 위해 더 이상 아무것도하지 않습니다.

자바와 이야기 할 수 없습니다.

0

C++의 경우 : const 함수의 한정자는 클래스의 모든 변경 불가능한 멤버를 만들고이 함수 본문 내에서 this 포인터를 const const-qualified로 만듭니다. 그게 다야.

ADD는 :

이 CONST 기능이 명시 적으로 또는 암시 적 비 CONST 같은 this 포인터를 액세스하는 경우는 컴파일 오류를 생성한다 포인터를 의미한다.

0

In C++ : 컴파일러는 멤버 변수 (또는이 객체)에서 비 const 함수의 호출 인 명백한 오류를 감지합니다. 호출 연산자 = 등이 포함됩니다. 일반적으로 "const ... T ... to ... T ..."를 변환 할 수 없습니다.

이것을 우회하려면 const_cast을 사용할 수 있습니다.

함수의 constness는 호출 후 객체의 상태가 변경되지 않는다는 것을 의미하지는 않습니다. 예를 들어, 그 코드 :

class A 
{ 
public: 
    // stuff... 
    // 
    int* getPointer() const {return mpA;} 
private: 
    int* mpA; 
} 

당신이 값이 외부에서 MPA가 가리키는에 액세스하고 ... 개체 MPA 자체가 수정되지 않습니다 수정할 수 있습니다 (그래서 getPointer의 const와는 존중 받는다.) 그러나 mpA가 가리키는 가치의 일정성은 보장되지 않는다. 실제로 보장하기에는 너무 많은 작업이 필요합니다.

0

C++의 경우 const 한정자는 해당 유형의 한정자입니다. 실제로 const 한정 이름은 정교 유형 (표준 이후)입니다.

함수 오버로드 해결을 수행 할 때 컴파일러는 예를 들어 std::string을 인수로 사용하여 void foo(int)을 호출하지 못하게하는 일반 메커니즘을 적용합니다.

개발자를 돕기 위해이 특정 오류에 대한 진단 기능이 향상되었을 수 있습니다. 파일에서 인스턴스화

객체 : C++에서

는이 특히 const_cast 객체의 CONST 다움을 제거 할 수 있다는 사실에 의해 설명되는 ... 단지 하나 미묘있다 범위 (전역, 통계 등)는 const이 컴파일러의 재량에 따라 읽기 전용 메모리에 배치 될 수 있습니다.이 경우 const_cast입니다. 정의되지 않은 동작입니다.

0

그리고 위의 사항을 더 추가하면 간단 해집니다. const 함수에서 컴파일러는 상수 포인터로 만듭니다. const int a = 10; a = 20은 분명히 오류를 발생시킵니다.

관련 문제