2010-12-20 3 views
13

C 및 C++에서 변수의 const 한정은 어떻게 다릅니 까?C와 C++에서 "const"는 어떻게 다릅니 까?

에서 : Does "const" just mean read-only or something more?

의 "이 질문을하라는 메시지가 표시하는 것은이 대답했다 : https://stackoverflow.com/questions/4024318#4024417 그는 말한다 const를"그냥 "읽기 전용 의미 C.에 내가 그 모든 CONST는 관계없이 C 또는 C 여부의 의미입니다 생각 ++ 그게 무슨 뜻이야? "

+0

http : // stackoverflow.com/questions/455518/how-many-of-the-use-of-const-in-c – karlphillip

+1

@karlphillip : 답변이 아닙니다. 이것은 C++에서 const를 사용하는 것을 나열하지만 C와 C++ 사이의 const 차이점을 나열하지 않습니다. 완전히 다른. –

+0

답변이 있어야한다면 그렇게 게시 할 것입니다. – karlphillip

답변

8

const은 상수 표현식을 작성하는 데 사용할 수 없습니다. 예를 들어

: 케이스 라벨 정수 상수로 감소하지 않기 때문에

#include <stdio.h> 
int main() 
{ 
    int i = 2; 
    const int C = 2; 
    switch(i) 
    { 
     case C : printf("Hello") ; 
     break; 

     default : printf("World"); 
    } 
} 

는 C에서 작동하지 않습니다.

+0

내가 잘못 기억하고있을 수도 있지만, C99에서 이것이 바뀌 었다고 생각합니다. – ephemient

+0

@ephemient : Nopes. 내 대답을 다시 확인하십시오. –

7

const입니다.은 변수를 변경하지 않을 것을 약속합니다. 그것은 여전히 ​​바뀔 수 있습니다. a을 변경할 수 있습니다

class A { 
    public: 
    A(const int& a); 
    int getValue() const; 
    void setValue(int b); 
    private: 
    const int& a; 
}; 
A::A(a) : a(a) {} 
int A::getValue() const { 
    return a; 
} 
void A::setValue(int b) { 
    a = b; // error 
} 

int main() { 
    int my_a = 0; 
    A a(my_a); 
    std::cout << a.getValue() << std::endl; // prints 0 
    my_a = 42; 
    std::cout << a.getValue() << std::endl; // prints 42 
} 

어떤 방법 없다 A::*하지만 main 캔. 그 정도는 C와 C++간에 동일합니다. 이 무엇 C++


부적절 const을 폐기에서 프로그래머를 억제 해야하는 const을 우회하는 커플 (제한) 방법이다.

이 같은 수업을 듣습니다.

class A { 
    public: 
    A(); 
    int getValue(); 
    private: 
    static int expensiveComputation(); 
    int cachedComputation; 
}; 

A::A() : cachedComputation(0) {} 

A::getValue() { 
    if (cachedComputation == 0) 
     cachedComputation = expensiveComputation(); 
    return cachedComputation; 
} 

cachedComputation 암시 this->cachedComputation을 의미한다. 이를 명심하십시오. 비 const 메소드가 호출 const A a2 중이므로

int main() { 
    A a1; 
    const A a2; 
    std::cout << a1.getValue() << std::endl; 
    std::cout << a2.getValue() << std::endl; // error 
} 

a2.getValue() 불법이다. 컴파일러는 다른, 단지 const -ness가 주조되고 있다는 것도 확인 없기 때문에 하나는

std::cout << ((A&)a2).getValue() << std::endl;   // C-style cast 
    std::cout << const_cast<A&>(a2).getValue() << std::endl; // C++-style cast 

두 번째

선호합니다 ... const -ness을 멀리 캐스팅 할 수있다. 그러나 이것은 여전히 ​​이상적이지 않습니다. 대신 클래스에 새로운 메소드가 추가되어야합니다.

class A { 
    public: 
    int getValue() const; 
}; 

A::getValue() const { 
    if (cachedComputation == 0) 
     cachedComputation = expensiveComputation(); // error 
    return cachedComputation; 
} 

지금 너무 a2.getValue() 괜찮하는 const 방법이있다. 그러나 후행 const은 메서드에 포인터가 지정되어 있으며 평소와 마찬가지로 A *this 포인터가 아니므로 this->cachedComputationconst int &이고 변경할 수 없습니다.

const_cast은 메서드 내부에 적용 할 수 있지만이 멤버의 선언을 변경하는 것이 좋습니다. 심지어 const A *this와 지금

class A { 
    private: 
    mutable int cachedComputation; 
}; 

this->cachedComputation 캐스팅없이 변이 될 수있다.

+0

나는 귀하의 게시물이 그의 질문에 대답하지 않는다고 생각합니다. ** C **에서'const'에 대해 쓰지 않았습니다. –

+0

@ephemient : @ Prasoon 님의 답변을 답장에 추가하면이를 수락합니다. 불행히도,이 시점에서, 어느 쪽의 대답도 그 질문에 완전히 답하지 않습니다. 나는 당신의 것이 더 완전하다고 믿습니다. (FYI, 나는 그가 올바른지 확인하기 위해 gcc -std = c99로 Prasoon의 대답을 테스트했다.) –

+1

@Prasoon : 그는 C++이 가변 키워드를 제공하지만 C는 그렇지 않음을 보여줍니다. 나는 그것이 언어 내에서 const의 사용과 직접적으로 관련이 있다고 생각한다. 틀린가? 나는 당신의 대답도 중요한 차이점이 있다고 생각합니다. –

관련 문제