'mutable'에 해당되는 글 1건

  1. 2013.04.15 const
posted by WizardMania 2013. 4. 15. 10:09

일반적으로 const는 해당 변수를 상수화 한다고한다. (값의 변경 불가)

하지만 쓰이는 곳에따라 의미가 조금씩 다르다고 할 수 있다.




기본자료형 변수 에서의 const


const int num = 10;

num 변수는 상수화 되어 다른값의 대입이 불가능 하다.

num = 20; 같은 대입이 불가능하다. (값을 가져와 쓰는것만 가능하다.)


변수 생성과 동시에 값이 초기화 되어야한다.


const int num;           // 불가능 초기화값이 존재하지 않는다.

const int num = 20;    // 가능 초기화값이 존재한다.




포인터 에서의 const


const가 포인터 앞에붙냐 뒤에붙냐에 따라 나뉘게 된다.


const int* pNum = #

pNum 변수를 참조해서 값의변경이 불가능 하다.

*pNum = 10; 불가

num변수를이용하여 값을 변경 하는것은 가능하다.

num = 10; 가능


int* const pNum = #

포인터 변수 pNum에 다른 주소값으로 변경이 불가능 하다.

pNum  = &num2; 불가

pNum 변수를 참조해서 값의 변경은 가능

*pNum = 20; 가능


물론 위의 두개를 동시에 사용할 수 도 있다. (위두가지 특성을 모두 가지게 된다)

const int* const pNum = #




예제 클래스

class SimpleClass
{
public:
	int num1;
	int num2;

	SimpleClass()
		: num1( 0 ), num2( 0 )
	{
	}

	int Function1()
	{
		num1 += 10;
		return num1;
	}

	int Function2() const
	{
		// 이함수 내에서 멤버변수의 변경 불가
		return num2;
	}
};

const 멤버함수


class의 const 멤버함수는 함수내에서 멤버변수의 값이 변경되는것을 막는다.

또한 외부에서 멤버변수의 변경가능성이 존재하는 포인터, 레퍼런스로 리턴하는것도 불가능 하다. 

함수이름 뒤쪽에 const를 붙여준다.


int Function2() const 

{

return num2;

}


다음과 같은 멤버변수 변경이 불가능 하다.

int Function2() const 

{

num2 += 10;    // 불가능

return num2;

}


객체에서의 const


const 객체는 멤버변수 값의 변경이 불가능하며 const 멤버 함수만 호출 가능 하다.


const SimpleClass* simple1 = new SimpleClass;

simple1->Function1()  // 불가능

simple1->Function2()  // 가능

simple1->num1 = 10;   // 불가능




mutable


해당멤버 변수는 const멤버함수 내에서의 값의 변경이 허용된다.

멤버변수 num2 가 mutable int num2; 으로 선언되어있다면  불가능 했던 아래코드가 가능하다.

int Function2() const 

{

num2 += 10;    // 가능

return num2;

}


const 함수가 무의미해질 수 있기 때문에 특별한 경우가 아니라면 사용을 안하는 것이 좋다.




const_cast


c++에서 추가된 형변환 연산자이다.


포인터와 참조자의 const를 제거 하는 목적으로 사용된다.

const 를 사용하게되면 위에서봤던 제약조건들이 생기게된다.

유일하게 const_cast로 const 성향을 없애줄 수 있다.


const SimpleClass* simple1 = new SimpleClass;

SimpleClass* simple2 = const_cast<SimpleClass*>(simple1);    // const가 제거된다

simple2->Function1();    // const가 제거되었기 때문에 const멤버함수가 아닌 함수도 호출가능

simple2->num1 = 5;        // const가 제거되었기 때문에 public 멤버 변경가능


무분별한 사용은 const를 무의미하게 하기때문에 특별한 용도로만 쓰는 것이 좋다.




const의 중요성