본문 바로가기

C++

C++ Const

Const란
해당 변수, 함수, class를 상수화 시키겠다는 의미이다.

 

 

const특징

const를 선언한 객체는 반드시 선언과 동시에 초기화를 해야 합니다.
만약 선언과 동시에 초기화를 하지 않으면 쓰레기 값이 들어가고 값 변경이 불가능해집니다.

 

const변수

1
2
3
4
5
6
 
void main()
{
    const int value = 10;
    value = 20;
    cout << value << endl;
}
cs

 

3행 : const 변수 선언
4행 : const 변수의 값을 20으로 수정하려고 한다. 당연하지만 해당 부분에서 컴파일러는 에러를 발생한다.
이유는 상수화된 값을 수정하려고 하였기 때문이다.

위에 예제를 보듯 const 변수는 간단하게 그냥 변수 앞에 const를 선언하는 게 전부이면 const를 선언한 변수는
절대 값 변경이 안된다. 만약 네가 const 변수의 값을 변경해서 대입하고 싶을 경우에는 해당 변수의 값 const_cast로
변경하여 사용해야 한다.

 

class의 전역 변수 초기화

const는 무조건 선언과 동시에 초기화되어야 한다고 했다.
그러나 class의 전역 변수를 const로 만들어 객체마다 다른 값의 const 값을 저장하려고 한다면
미리 선언하고 초기화할 수 없다. 그럴 때는 생성자에서 이니셜라이저 : const 변수(매개변수)로 해결할 수 있다.

1
2
3
4
5
6
7
8
9
 
class AAA
{
    const int value;
public:
    AAA(int mValue) : value(mValue)
    {
 
    }
};
cs

3행 : const 변수 선언
5행 : const 변수 value를 매개변수 mValue로 초기화한다..
원래라면 불가능하지만 해당 문법을 이용하면 const 변수를 나중에 초기화하는 게 가능해진다.

 

const Point

point에도 const를 선언할 수 있다. 다만 point의 경우에는 const를 어디에 선언하느냐에 따라 상수가
되는 부분이 달라지는데
const int* ptr
해당 문장에서는 역참조의 값이 상수화된다. 그래서 *ptr = 20을 대입하게 되면
상수의 값을 건드리게 되어 컴파일 에러가 발생한다.
int* const ptr
해당 문장에서는 주솟값이 상수화된다. 그래서 ptr의 다른 주솟값을 대입하게 되면
컴파일 에러가 발생한다.

 

const함수

cosnt 함수는 해당 함수안 에서는 지역변수를 제외한 나머지는 값 변경이 불가능을 의미한다.

1
2
3
4
5
6
7
8
9
10
11
12
 
class AAA
{
public:
    int value = 10;
 
    void Add() const
    {
        int a = 10;
        a = 20;
        value = a;
    }
};
cs

6행 : const 함수를 선언
8~9행 : a를 10으로 초기화한 뒤 20으로 값 변경을 하였다.
10행 : value의 값을 a로 변경하였다. 여기서 컴파일러는 에러를 출력한다.
const 함수에서 값 변경이 일어났기 때문이다. value가 const 인지는 중요하지 않다 함수가 const이기 때문에
const 선언을 하지 않은 value도 값 변경이 불가능하다.

 

const함수 안에서는 const변수, 지역변수 , const함수만 사용가능하다.

 

TMI

기본적으로 멤버 함수들은 const로 만들어라
기본적으로 포인터와 참조는 const로 전달하여라
const를 선언함으로써 다른 사람들이 함부로 값 변경하는 것을 예방할 수 있고
다른 사람들도 const를 보고 바로 이 값은 절대 변경하면 안 되는 것이라는 것을 알 수 있다.

 

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

C++ 복사생성자  (0) 2020.09.16
C++ Static  (0) 2020.09.15
C++ 조건부 컴파일  (0) 2020.09.07
C++ 매크로,매크로 함수  (0) 2020.09.07
C++ 함수포인터  (0) 2020.09.07