본문 바로가기
C,C++/정보정리

[C/C++] C++에 왔으면 C++의 법을 따릅시다 - (2)

by 마두식 2023. 4. 10.
반응형

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

댓글