티스토리 뷰
현재 프로그램을 짜거나 할 때 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는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수 및 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있습니다.
※ 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 여러분은 개념적인(논리적인) 상수성을 사용해서 프로그래밍해야 합니다.
※ 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때 비상수 버전이 상수 버전을 호출하게 만드세요.
'프로그래밍 언어 > Effective C++' 카테고리의 다른 글
항목8) 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2023.04.25 |
---|---|
항목5) C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2023.04.25 |
항목19) 클래스 설계는 타입 설계와 똑같이 취급하자 (0) | 2023.04.10 |
- Total
- Today
- Yesterday
- 레지스터
- 지뢰찾기
- 멀티쓰레드
- 스레드풀
- 컨퍼런스
- Select모델
- queue
- 자료구조
- 고양이
- 개발
- 알고리즘
- 인제대학교
- 야경
- 시스템보안
- 워셜알고리즘
- c++
- 백준
- 정보보안
- 더블버퍼링
- 드림핵
- BFS
- Dreamhack
- 보안
- STL
- 링크드 리스트
- 학교
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |