C++코딩중 "const"라는 단어 참 많이 보게된다.
간단하게 설명 하자면 const가 걸린 위치의 값이 변동 되지 않도록 상수화 시키는 명령어 라고 보면 될것이다.
그런데 이 const라는 명령어가 참 다양한 위치에 붙을 수 있고, 그위치마다 하는 짓이 약간씩 다 다르다는게 문제다.
그래서 이걸 좀 정리 해보고자 한다.
변수에서는
[const] [dataType] [const] [Pointer] [const] [VariableName]
[const] [자료형] [const] [포인터] [const] [변수명]
멤버 함수에서는
[const] [dataType] [const] [Pointer] [const][Function([const]Parameters)] [const] {Function Codes}
[const] [자료형] [const] [포인터] [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()
{
}
};
'Study > C,C++' 카테고리의 다른 글
[C/C++]형변환(Cast)의 종류와 사용법 (0) | 2022.03.18 |
---|