Skip to content

Latest commit

 

History

History
64 lines (54 loc) · 2.8 KB

Item3.md

File metadata and controls

64 lines (54 loc) · 2.8 KB

항목 3. 낌새만 보이면 const를 들이대 보자!

const

  • const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는데 도움을 준다.
  • const객체, 함수 매개변수, 반환 타입, 멤버 함수 등 다양한 곳에 붙을 수있다.
  • 클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언하는데 쓸 수 있다.
  • 파일, 함수, 블록 유효범위에서 static으로 선언한 객체에도 붙일 수 있다.
  • const 유무로 함수 오버로딩이 가능하다.
char hello[] = "HELLO";
char testing[] = "TEST";

const char* p = hello;       // 상수를 가리키는 포인터
// p[1] = 'T'; 에러

char* const p = hello;       // 상수 포인터
// p = testing; 에러

const char * const p = hello // 상수를 가리키는 상수 포인터
// 위 2개 모두 에러

상수 멤버 함수

  • 멤버 함수에 const가 붙으면 상수 멤버 함수가 된다.
  • 상수 객체에 대해 호출되는 함수이다.

중요한 이유

  • 클래스의 인터페이스를 이해하기 좋게 한다.
    • 클래스로 만들어진 객체를 변경할 수 있는 함수와 없는 함수를 사용자 쪽에서 알 수 있다.
  • 상수 객체를 사용할 수 있게 하자는 것이다.

비트 수준 상수성

  • 물리적 상수성이라고도 한다.
  • 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 그 멤버 함수가 const임을 인정하는 개념
  • 객체를 수정하는 비트들 중 어떤 것도 바꾸면 안 된다.

const로 동작하지 않는데도 비트 수준 상수성 검사를 통과하는 멤버 함수

class TextBlock {
public:
    TextBlock(char* test)
    {
        pText = test;
    }
    // 부적절하지만 비트수준 상수성이 있어서 허용되는 operator[]의 선언
    char& operator[](size_t position) const
    {
        return pText[position];
    }
private:
    char* pText;
};

const TextBlock cctb("Hello"); // 상수 객체 선언
char* pc = &cctb[0]; // 상수 버전의 operator[]를 호출하여 cctb의 내부 데이터에 대한 포인터를 얻음
*pc = 'J'; // cctb는 "Jello"가 된다.

논리적 상수성

  • 위에서 나온 특수한 상황을 보완하는 대체 개념
  • 상수 멤버 함수라고 해서 객체의 한 비트도 수정할 수 없는 것이 아니라 일부 몇 비트 정도는 바꿀 수 있되 그것을 사용자측에서 알아채지 못하게만 하면 상수 멤버 자격이 있다는 개념
  • 키워드 mutable을 사용한다.