3. 낌새만 보이면 const를 들이대 보자.

1. const 를 해석하는 방법(나도 잘 몰랐다 ㅋㅋㅋ)

char greeting[] = “Hello”; 둘다 비상수
char *p = “greeting”; 위와 동일
const char *p = greeting; p는 상수 데이터를 가리키는 포인터
*고로 인해 p 에는 다른 값을 대입할 수 있다.
p = “Hello”;
요런거, 단 greeting 안에 내용은 못 바꿈 –_-;
char * const p = greeting; 상수 포인터
비상수 데이터
이제 p 는 다른 값을 못가진다.
그런데 greeting 은 변경 가능
const char * const p = greeting 둘다 상수!!!
위의 두가지 특성, p에 다른 값도 못 넣고 greeting 내용도 못 바꾼다.

const 키워드가 * 표의 왼쪽에 있으면 포인터가 가리키는 대상이 상수

– 즉 데이터를 못 바꾼다!!!

const 키워드가 * 표의 오른쪽에 있으면, 포인터 자체가 상수

– 즉 포인터에 딴 값이 안들어간다.

void f1(const Widget *pw ) = void f2(Widget const * pw)

위의 둘 다 같은 의미이다. 다 * 의 왼쪽에 const가 있다.

*비트 수준 상수성: 절대적으로 일말의 변경이라도 있으면 안됨

*논리 수준 상수성: 사용자가 보기에만 변경이 없어보임, 실제로 변화가 있을 수 있음.

lazy creating 을 위해서 최초에만 계산을 하고 후에는 계산한 값을 계속 사용한다고 할때

 

std::size_t CTextBlock::length() const

{

if( !lenthIsValid )

{

textLength = std::strlen(pText); //원칙적으로 const 함수 내에서 변수의 값을 바꾸는 행위는 불가능

lengthIsValid = true;

}

}

그러나 textLength, lengthIsValid 를 mutable 키워드를 이용해서 풀어주면 상수성을

유지하면서도 해당 변수들의 값을 변경할 수 있다.

 

mutable std::size_t textLength;

mutable bool lengthIsValid;

 

상수 멤버 및 비상수 함수 멤버 함수에서 코드 중복 현상을 피하는 방법

1. 상수 함수와 비상수 함수를 따로 정의하는 것이 가능하다.

* const 객체는 비상수 함수를 호출할려고 한다.

예전에 const 로 넘기면 함수가 호출되지 않던것을 const 객체는 모든 리턴값이

const 로 되어야 하고 내부에서 값을 바꿀려고 하면 안되었기 때문이다.(나는 바보!!!)

2. 결국 비상수 함수가 상수 멤버 함수를 호출하게 한다.!!!!!(안전성을 위해서)

return const_cast<char &>( static_cast<const TextBlock &>(*this)[position]);