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() const | const 여부로 구분 가능 |