포스트

[C++] const 키워드

[C++] const 키워드

C++ const 키워드 위치에 따른 의미 정리

const는 C++에서 값을 변경하지 못하도록 보호하는 키워드입니다. 하지만 위치에 따라 의미가 달라지므로 주의해서 사용해야 합니다. 이 문서에서는 일반 변수, 포인터, 함수 인자/반환값, 멤버 함수, 그리고 오버로딩까지 포함한 예제를 정리합니다.


1. 일반 변수에서 const

1
2
const int a = 10;
// a = 20; // 컴파일 에러: 상수는 값 변경 불가

2. 포인터와 const의 조합

선언의미
const int* ptr값을 수정할 수 없음
int* const ptr포인터 주소를 바꿀 수 없음
const int* const ptr값과 주소 모두 변경 불가

예시 코드

1
2
3
4
int a = 10, b = 20;
const int* p1 = &a;   // *p1 = 5; 는 오류, p1 = &b; 는 가능
int* const p2 = &a;   // *p2 = 5; 는 가능, p2 = &b; 는 오류
const int* const p3 = &a; // *p3 = 5; 오류, p3 = &b; 오류

3. 함수 인자와 반환값

인자에 const 적용

1
2
3
void func1(const int x);         // x를 수정 불가
void func2(const int* ptr);      // *ptr 수정 불가
void func3(int* const ptr);      // ptr 수정 불가 (주소 고정)

반환값에 const 적용

1
2
3
4
const int getValue();            // 반환된 int는 변경 불가
const int* getPointer();         // 반환된 포인터가 가리키는 값 수정 불가
int* const getPointerFixed();    // 반환된 포인터 주소 고정
const int* const getReadOnly();  // 값과 주소 모두 변경 불가

4. 멤버 함수에서 const

정의

멤버 함수 선언 뒤에 const가 붙으면 해당 함수는 객체의 멤버를 수정하지 않겠다는 약속입니다.

1
2
3
4
5
6
7
8
9
10
11
class MyClass {
    int value;
public:
    int getValue() const;    // const 멤버 함수
    void setValue(int v);    // 비-const 멤버 함수
};

int MyClass::getValue() const {
    // value = 5; // 오류: const 함수는 멤버 수정 불가
    return value;
}
  • const 멤버 함수는 this 포인터가 const MyClass*로 바뀝니다.
  • mutable 키워드를 사용하면 const 멤버 함수에서도 일부 멤버 수정이 가능함.

5. const 함수 오버로딩

같은 이름, const 여부만 다른 함수는 오버로딩 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Example {
public:
    void show();          // 일반 함수
    void show() const;    // const 멤버 함수
};

void Example::show() {
    std::cout << "non-const show()\n";
}

void Example::show() const {
    std::cout << "const show()\n";
}

int main() {
    Example obj1;
    const Example obj2;

    obj1.show();  // non-const 버전 호출
    obj2.show();  // const 버전 호출
}
  • const 객체는 const 멤버 함수만 호출 가능합니다.
  • 이를 활용하면 읽기 전용 객체와 일반 객체에 대해 다른 동작을 정의할 수 있습니다.

6. 요약표

선언의미
const int a상수 변수
const int* ptr값 수정 불가
int* const ptr포인터 주소 수정 불가
const int* const ptr값과 주소 모두 수정 불가
void func() const멤버 수정 불가 함수
오버로딩: f() vs f() constconst 여부로 구분 가능
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.