728x90
const란?
값을 변경하지 못하도록 상수화 시키는 명령어입니다.
C++에서 const명령의 위치에 따른 의미를 정리하겠습니다.
1. 변수 앞 const
const int num = 10;
// 변수 num을 상수화
2. *앞 const
const int *ptr = &value;
// 포인터가 가르치키는 값(실체)가 불변
const int *ptr = &value;
이렇게 적용이 된다.
&value의 값이 불변이 되어버렸기 때문에
-> *ptr = 10 ( X )
하지만 포인터 변수는 자유롭기 때문에 새로운 변수를 포인터에 연결하는 ptr = &value2는 가능하다.
3. *뒤 const
int * const ptr = &value;
// 포인터 변수가 불변
int * const ptr = &value;
이렇게 적용이 된다.
*ptr = 10; 또는 *ptr = 40;
-> 변수의 값(실체)은 자유롭기 때문에 포인터의 값을 변경하는 것은 가능.
하지만, ptr = %value2 ( X )
-> 포인터가 가리키는 위치를 변경하는 것은 불가능
3. *앞뒤 모두 const
const int * const ptr = &value;
// 실체와 변수 모두 불변
const int * const ptr = &vlaue;
이렇게 적용이 된다.
앞서 본 1, 2를 합친 개념입니다.
4. 멤버 변수의 뒤에 오는 const
class SimpleClass {
private:
int num;
public:
void InitNum(int n) : num(n) { }
int GetNum() { // const 선언이 추가되어야 에러 소멸
return num;
}
void ShowNum() const {
cout << GetNum() << endl; // 컴파일 에러 발생
}
};
멤버 함수 뒤에 오는 const는 2가지 의미를 가진다.
- 이 멤버 함수에 있는 멤버 변수는 수정하지 않겠다(불변)
- 오직 읽기 전용(ReadOnly)으로만 호출하겠다.(쓰기는 하지 않겠다.)
5. 매개변수의 자리에 오는 const
class EasyClass {
private:
int num;
public:
void InitNum(int n) : num(n) { }
int GetNum() { // const 선언이 추가 되야함.
return Num;
}
};
class LiveClass {
private:
int num;
public:
void InitNum(const EasyClass &easy) { // 참조자로 매개변수 객체 생성
num = easy.GetNum(); // 에러 발생
}
};
참조자로 받아오는 경우에도 4번의 2가지 법칙이 적용됩니다.
복사 오버헤드 없이 참조자로써 가져오지만 참조자 객체를 사용할 경우 읽기전용(ReadOnly)로만 사용하겠다는 의미.
728x90
'[Computer Science] > [C & C++]' 카테고리의 다른 글
2개 이상의 class 파일 분할 (0) | 2022.03.24 |
---|---|
C++ 파일 분할(visual studio) (0) | 2022.03.24 |