const 위치에 따른 의미들
const가 걸린 위치에서는 값이 변경이 안되게 하는 상수화하는 명령어입니다.
const는 다양한 위치에 붙을수 있는데,
변수에서는
[const] [dataType] [const] [Pointer] [const] [VariableName]
[const] [자료형] [const] [포인터] [const] [변수명]
멤버 함수에서는
[const] [dataType] [const] [Pointer] [Function(Parameters)] [const] {Function Codes}
[const] [자료형] [함수명([const]매개변수)] [const] {함수 코드}
이런 식으로 붙을수 있다.
예를 들어 설명하면
1. const int ** num;
2. int * const * num;
3. int ** const num;
1번 선언문은
(const int) ** num; 이렇게 묶입니다.
const int의 이중 포인터이므로,
num과 *num 의 값은 주소 값이죠.
이 주소 값들은 const가 걸리지 않아 얼마든지 바꿀 수 있지만,
**num은 이중 포인터를 타고 들어가 const int의 값에 도달합니다.
이는 상수화 되어 바꿀 수 없죠.
2번 선언문은
(int * const) * num; 이렇게 묶입니다.
이번에는 int* 를 상수화 한 것입니다.
num과 **num은 바꿀 수있지만 *num의 값은 바꿀수 없게 됩니다.
3번 선언문은
(int **) const num; 으로 묶입니다.
int** 자체를 상수로 만들었으니 이중 포인터 값은 변경이 안되는 것이겠죠.
**num과 *num은 변경이 가능하지만 num은 변경이 불가능 해 집니다.
멤버 함수에서는
class A
{
public:
int* m_nData;
const int* Func(int* n)
{
m_nData = n;
return (const int*)m_nData;// ->return타입이 const가 아니면 에러
}
};
class A
{
public:
int* m_nData;
int* Func(const int* n)
{
*n = 2000;//n을 변경하려하면 에러
return (int*)n;
}
};
class A
{
public:
int* m_nData;
int* Func(int* n) const
{
m_nData = n; //멤버변수를 변경하려고 하면 에러
Func2();
Func3(); //const객체는 const멤버함수가 아닌 다른 함수 호출 시 에러
return m_nData;
}
int* Func2() const
{
}
int* Func3()
{
}
};