본문 바로가기

Study/C,C++

위치에 따른 "const"의 의미들

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