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]);