티스토리 뷰

현재 프로그램을 짜거나 할 때 const를 자주 사용하지 않았었는데, 이 주제에서 const를 상당히 중요하게 보는 것을 보고 깨우쳤습니다. 상당히 중요해 보이더라구요. 특히 컴파일 할 때 에러를 잡아줄 수 있는 부분의 메리트가 상당히 커 보였습니다.

 

다음은 const가 붙는 위치에 따른 변수의 변화입니다.

char test1[] = "Hello";
char test2[] = "World";

char *p = greeting;

const char *p = greeting           // 비상수 포인터
                                    // 상수 데이터
[0] = test2[0];                     //error
p = test2;                          //complete
        
char * const p = greeting          // 상수 포인터
                                    // 비상수 데이터
p[0] = test2[0];                    //complete
p = test2;                          //error

const char const* p = greeting    // 상수 포인터
                                    // 상수 데이터
p[0] = test2[0];                    //error
p = test2;                          //error

 

클래스에서도 const가 사용되는데, 여기서 중요한건 상수 멤버 함수입니다.

멤버 함수에서 const를 어디다 붙이느냐에 따라서 용도가 달라집니다.

const char& operator[] (std::size_t postion) const // 상수 객체에 대한 operator[]
{ return text[position]; }

char& operator[] (std::size_t postion)		// 비 상수 객체에 대한 operator[]
{ return text[position]; }

TextBlock tb("Hello");
const TextBlock ctb("World");

std::cout << tb[0];		// 가능

tb[0] = 'x';			// 가능

std::cout << ctb[0];	// 가능

ctb[0] = 'x';			// 불가능

 

단 여기서 에러는 operator[]의 반환타입이 const char&로 리턴되어있기 때문입니다.

 

비트수준 상수성(Bitwise constness)

어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 멤버 함수가 'const'임을 인정하는 개념입니다.

 

논리적 상수성(Logical constness)

상수 멤버 함수라고 해서 객체의 한 비트도 수정할 수 없는 것이 아니라 일부 몇 비트 정도는 바꿀 수 있되, 그것을 사용자측에서 알아채지 못하게만 하면 상수 멤버 자격이 있다는 개념입니다.

 

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

class TextBox {
public:
	...
	const char& operator[](std::size_t position) const {
		....
		....
		....
		return text[position];
	}
	char& operator[](std::size_t position) {
		return const_cast<char&>(		// op[]의 반환 타입에 캐스팅을 적용,
                                    			// const를 떼어냅니다.
			static_cast<const TextBlock&>	// *this의 타입에 const를 붙입니다.
			(*this)[position]		// op[]의 상수 버전 호출
		);
	}
};

 

※ const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는데 도움을 줍니다. const는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수 및 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있습니다.

※ 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 여러분은 개념적인(논리적인) 상수성을 사용해서 프로그래밍해야 합니다.

※ 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때 비상수 버전이 상수 버전을 호출하게 만드세요.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함