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

Advertisements

2. define을 쓰려거든 const, enum, inline 을 사용하자.

부제 : 가금적 선행 처리자보다 컴파일러를 더 가까이 하라.

1. define 보다는 const 를 사용하자.

#define ASPECT_RATIO 1.653 보다는

const int ASPECT_RATIO=1.653 이 났다.

왜일까?

1) 디버그에서 define 은 값으로 변해서 알 수 없지만, const 는 값을 알 수 있다.

2) ASPECT_RATIO 의 주소값등이 필요할 때 사용할 수 없다.

 

* define 대신에 const 를 쓸 때 주의할 경우

1) 포인터는 꼭 const 로 사용하고, 그 대상도 const로 선언하자.

const char * const authorName = “Scott Meyers”;

const std::string authorName(“Scott Meyers”); <- 이것도 괜찮은 방법

2) 클래스 상수 정의

* define 은 유효 범위가 전체다( #undef 로 삭제는 가능 )

* 클래스 상수는 클래스 내에서만 영향을 미친다.

class GamePlayer
{
    public:
        static const int NumTurns = 5; <—지금까지 되는지 몰랐다.
        int Scores[NumTurns];             <—최근 컴파일러에서 가능
};

* 나열자 둔갑술

const 대신에 enum 사용

enum{ NumTurns = 5 };
int Scores[NumTurns];

* enum 은 define 에 가까움, 주소 얻기 불가능, 메모리 할당 없음
* const 도 원래 메모리 할당이 없어야 하지만, 구식 컴파일러라면 잘못 할당 할지도 모른다.

2. 매크로 함수보다는 inline 을 이용하자.

#define CALL_WITHMAX(a,b)    { ( (a) > (b) ) ? (a) : (b) }

이고 a 는 5, b = 0 일 때

CALL_WITHMAX( ++a, b ) 와

CALL_WITHMAX( ++a, b+10)  의 동작에서

전자는 a가 2가 증가, 후자는 1만 증가한다.

* 이유는? MACRO에서는 a의 값이 아니라 ++a 자체로 들어가므로 a > b 인

경우에는 ++a 가, 두번 실행된다.

inline 함수라면 이미 값이 넘어가므로 문제 없음.

1. C++에 왔으면 C++의 법을 따릅시다.

항목1 은 큰 내용이 없습니다.

C의 문법

객체 지향 개념의 C++

소프트웨어 설계 5원칙을 알아두는게 좋겠죠?

템플릿 C++

요새 TMP 라는 무공이 있습니다. 그러나, 전 주화입마 할것 같아서 패스

STL

 

C만 알때보다, C++에 더 효과적인 방법이 있습니다.