2016-06-08 2 views
7

const value은 프로그래밍에서 자주 사용됩니다. 프로그래머가 미래에 값이 변하지 않을 것이라고 보안을줍니다. 불행하게도 이것은 완전히 시행되지 않습니다. 결과적으로 때때로 해독하기 어려운 미묘한 버그가 발생합니다. 예로서 :C++에서 const 값을 변경하는 방법

int a = 1; 
const int& b = a; // I promise I will not change 
a = 3; // I am a liar, I am now 3 
cout << b; // As I will now show 3 

또한 다른 방식 const 값을 변경하는 것이 가능하다; 그 중 일부는 상당히 복잡하며 코드의 다른 부분에서 손실되어 버그를 유발하는 많은 양의 코드가 필요합니다.

따라서 누구나 const value을 변경할 수있는 방법을 자세히 설명해 주시겠습니까? 네가 모든 것을 알지 못한다고해도 걱정하지 마라. 많은 것을 포함하지 않을 것이다. 네가 아는 모든 방법을 말해라. 결국 너는 네가 가진 것을 줄 수있다.

+8

'a'가 비 const이므로'a = 3'은 거짓말이 아닙니다. 'const_cast (b) = 3;'거짓말이 될 것입니다. –

+8

'b'은 그 값이 변하지 않을 것을 약속하지 않았습니다. 'const' 참조를 직접 사용하여 값을 변경할 수 없다는 것이 강요됩니다. 흥미로운 질문이라고 생각합니다. 그러나 여러분의 예제는 확실히 – user463035818

+2

이 아니지만,'b = 3'을했을 때'b' const가 아닌'a'가 아니라면이 예제 가짜가 아닙니다. – EdChum

답변

9
const int& b = a; // I only promise I will not change the value via b, nothing more. 

const 값이 다른 참조 또는 포인터에 의해 변경되지 않는다고 보장하지 않습니다. 다음 코드를 생각해

void f(const int& b) { ... } 
... 
int a = ...; 
f(a); 
a = ...; 

a의 값은 (전달 된 인수로) f() 내에서 변경되지 않습니다, 즉 모든 보장합니다.

const은 단순한 도우미입니다. sth를 변경하지 않으려면 const으로 만들고 컴파일러가 확인하는 데 도움이됩니다. 코드가 보여주는 것처럼 다른 방법으로 원래 값을 변경할 수도 있지만, 여전히 여러분의 책임입니다.

1

당신이 pointerconstvariable의 처음 사용 후, const_cast<data-type>() 문의 사용 울부 짖는 소리와 같은합니다

네임 스페이스를 사용하여 표준;

int main() 
{ 

    const int *i = new int(0); 
    int *n = const_cast<int*>(i); 

    *n = 10; 
    cout << *n << endl << *i << endl; 
    return 0; 
} 

출력은 다음과 같습니다

10 
10 
1

정의되지 않은 동작을 유발하지 않고 CONST 값을 변경하는 것은 불가능합니다.

컴파일러는 const와 non-const 값 사이의 차이점을 알아 내려하지 않습니다. 그것은 프로그래머 인 당신에게 타입 시스템을 통해 알려주는 것이다. 이름이 인 경우 const 또는 non-const이고 컴파일러가 이름이 인 const 값을 적용합니다.

const 값을 수정할 수있는 것처럼 보일 때가 있습니다. 예를 들어 그 값이 다른 값에 대한 참조를 가지고 있고 그 값을 수정할 때가 있습니다. 첫 번째 직관은 이러한 경우가 이런 식으로 행동해서는 안된다고 말하지만 일단 const-correctness를 이해하고 고려하면 일관성이 있음을 알게됩니다.

2

예, const_cast는 'const'키워드의 효과를 제거하는 데 사용할 수 있지만 항상 그렇지는 않습니다.

int a= 1; 
    const int& b = a; 
    a = 3; 
    std::cout<<b<<std::endl; 
    const_cast<int&>(b) = 4; 
    std::cout<<b<<std::endl; 

참조 : 여기서 http://en.cppreference.com/w/cpp/language/const_cast

2
int a=1; 
    const int *b=&a; 
    a=3; 
    cout<<(*b); 
    return 0; 
1
int k = 0; 
const int *l = &k; 
cout<<*l; // 0 
k=1; 
cout<<*l; // 1 

내가 constantl 같이 하나 개의 변수를 선언 예. 따라서 변수 l은 더 이상 변경할 수 없습니다. 그리고 k의 주소에 l을 할당합니다.

하지만 지금은 k의 값을 변경할 수 있으며, 동일한 메모리를 공유하기 때문에 l에 반영됩니다.

관련 문제