비타Cpp

const 위치에 따른 의미들 본문

C,C++

const 위치에 따른 의미들

멍C 2020. 5. 16. 16:36

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() 
    {

    }
};

 

 

 

 

'C,C++' 카테고리의 다른 글

변수의 주소값과 포인터 자료형  (0) 2020.05.17
R-value와 L-value  (0) 2020.05.17
조건문 switch  (0) 2020.04.22
조건문 if, if ~ else if ~ else 가위 바위 보 게임  (0) 2020.04.21
조건문 if, if ~ else if ~ else  (0) 2019.12.02
Comments