Effective C++ 3판을 기반으로 작성한 글입니다.
C/C++
- 항목 3: 낌새만 보이면 const를 들이대 보자!
- 함수 반환 값을 상수로 정해 주면, 안전성이나 효율을 포기하지 않고도 사용자의 에러 돌발 상황을 줄이는 효과를 볼 수 있다.
- 멤버 함수에 붙는 const 키워드의 역할은 "해당 멤버 함수가 상수 객체에 대해 호출될 함수이다"라는 사실을 알려 주는 것이다.
- const 키워드가 있고 없고의 차이만 있는 멤버 함수들은 오버로딩이 가능하다.
=> C++의 매우 중요한 성질이다.
- C++ 프로그램의 실행 성능을 높이는 핵심 기법 중 하나가 객체 전달을 "상수 객체에 대한 참조자(reference-to-const)"로 진행하는 것이다.
=> 상수 상태로 전달된 객체를 조작할 수 있는 const 멤버 함수(즉, 상수 멤버 함수)가 준비되어 있어야 한다
=> 즉, 상수 객체는 상수 함수만 부를 수 있다.
- 실제 프로그램에서 상수 객체가 생기는 경우
1. 상수 객체에 대한 포인터
2. 상수 객체에 대한 참조자로 객체가 전달될 때
- 어떤 멤버 함수가 상수 멤버(const)라는 것의 의미
1. 비트수준 상수성(bitwise constness, 물리적 상수성)
=> 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야(정적 멤버는 제외) 그 멤버 함수가 'const'임을 인정하는 개념이다.
==> 그 객체를 구성하는 비트들 중 어떤 것도 바꾸면 안 된다.
=> C++에서 정의하는 상수성이 비트수준 상수성이다.
=> 상수 멤버 함수는 그 함수가 호출된 객체의 어떤 비정적 멤버도 수정할 수 없다.
2. 논리적 상수성(logical constness)
=> 제대로 const로 동작하지 않는데도 비트수준 상수성 검사를 통과하는 멤버 함수들이 적지 않다.
==> 포인터가 가리키는 대상을 수정하는 멤버 함수들 중 상당수가 이런 경우에 속한다.(p.64)
=> 논리적 상수성이란 이런 상황을 보완하는 대체 개념으로 나온 것으로 상수 멤버 함수라 해도 객체의 한 비트도 수정 불가능한 것이 아니라, 일부 몇 비트 정도는 바꿀 수 있되, 그것을 사용자측에서 알아채지 못하게만 하면 상수 멤버 자격이 있다는 것이다.(p.65)
==> 비트수준 상수성을 지키면서 논리적 상수성을 만족하기 위해선 mutable 키워드를 사용하면 된다.
'C,C++ > 정보정리' 카테고리의 다른 글
[C/C++] C++에 왔으면 C++의 법을 따릅시다 - (1) (0) | 2023.03.22 |
---|---|
[C/C++] Thread - (1) (0) | 2023.02.15 |
[C/C++] Callable (0) | 2023.02.11 |
[C/C++] 자원 관리(feat. 스마트 포인터) (0) | 2023.02.10 |
[C/C++] Lvalue, Rvalue (0) | 2023.02.10 |
댓글