2011-12-28 2 views
2

함수가 reference의 매개 변수를 const object으로 가져갈 때 인수로 전달 된 개체를 reference을 사용하여 수정할 수 없다는 것을 알고 있습니까? 그래서 C++에서 const object에 대한 참조를 통해 수정할 수있는 시나리오가 있습니까? 그렇다면 예를 보여주십시오.참조를 사용한 const 개체 수정

답변

4

C++는 데이터 멤버 심지어 const를 참조을 통해 을 변경할 수 있습니다 mutable라는 기능이 있습니다

class Foo { 
public: 
    int a; 
    mutable int b; 
}; 

int main() { 
    Foo f; 
    f.a = 1; // ok 
    f.b = 2; // ok 
    const Foo &g = f; 
    g.a = 1; // compile error 
    g.b = 2; // ok 
} 

I을 다음 오류가 발생합니다.

 
In function 'int main()': 
Line 12: error: assignment of data-member 'Foo::a' in read-only structure 
compilation terminated due to -Wfatal-errors. 

그러나 할당 g.b = 2;이 성공합니다.

이 기능은 대개 private 멤버 변수에만 사용되며 데이터 멤버를 변경해도 개체의 외부에서 볼 수있는 constantness에 영향을주지 않습니다. 예를 들어, 이전에 계산 된 값을 캐시하는 방법을 제공하기위한 최적화로 사용될 수 있습니다.

+0

감사합니다. '이 기능은 일반적으로 전용 멤버 변수에만 사용됩니다 .' –

+0

정말 뭐라고 말하고 있는지. 위 예제에서와 같이'public mutable' 멤버 변수가 있다면'const'는 실제로 유용한 정보를 의미하지 않습니다. 왜냐하면 객체의 public 부분이'const' 참조를 통해서도 눈에 띄게 바뀔 수 있기 때문입니다. 반면에 'private mutable'멤버 변수가 이전에 계산 된 결과를 캐쉬처럼 내부적으로 처리하는 경우 객체의 * public * 부분은 시각적으로 동작을 변경하지 않습니다. –

1

을 사용하면 항상 const 정도를 버릴 수 있습니다. 주의하지 않으면 정의되지 않은 동작이 발생할 수 있습니다.

나는 당신이 뭔가를 고안있을 것 같아요 :

class Foo 
{ 
private: 
    mutable int x; 

public: 
    void bar() const { x++; } 
}; 

void func(const Foo &foo) 
{ 
    foo.bar(); 
    // foo is now modified! 
} 
+0

구체적인 질문은 * C++에서 const 개체를 참조 할 수있는 시나리오가 있습니까? *. 기술적으로, 객체 *가 const 인 경우 const const - Dess를 캐스팅하고이를 사용하여 수정하면됩니다. Undefined Behavior * always * –