본문 바로가기

Study/C++

[C++] Const

const

  • const int num = 10;
    • 변수 num을 상수화 하여, 변경할 수 없게 만듦
  • const int* ptr1 = &val2;
    • 포인터 ptr을 이용하여 val1의 값은 변경 불가, 하지만 포인터를 이용하지 않고 val = num와 같이 포인터의 위치는 변경이 가능
  • int* const ptr2 = &val2;
    • 포인터 ptr2가 상수화 됨, 포인터의 주소 변경이 불가능함
  • const int * const ptr3 = &val3
    • 포인터 ptr3가 상수화 되었으며, ptr3를 이용해서 val3의 값을 변경할 수 없음

Const 참조자의 또 다른 특징

  • 상수화된 변수의 경우 참조자 선언은 다음과 같이 할 필요가 있다.
const int num = 20;
const int &ref = num;
  • 이렇게 선언된 경우, 논리적 문제를 원천 차단할 수 있다.
  • 또한 const 참조자의 경우 앞선 규칙과는 사뭇 다른, 다음과 같이 상수 참조도 가능하다.
const int &ref = 50;
  • 먼저 리터럴 상수의 개념을 숙지할 필요가 있다.
  • 리터럴 상수란, int num = 20 + 30;의 문장이 있다면, 20과 30처럼 같은 프로그램상에서 표현되는 숫자를 가리킨다. 이들의 특징은 "임시적으로 존재하는 값이다. 또한 다음 행으로 넘어가면 존재하지 않는 상수다."
  • const의 경우 이러한 리터럴 상수를 임시변수라는 것을 만들어 상수를 참조하게끔 만든다. 이때 참조자는 임시변수를 참조하게끔 하여 앞선 규칙과는 사뭇 다른 재미있는 상황을 만드는 것이다.
  • 이러한 임시변수를 통한 참조는 다음과 같은 함수가 가능하게 끔 만들어준다.
int Addr(const int &num1, const int &num2)
{
	return num1 + num2;
}

int main(void)
{
	cout << Addr(3, 4) << endl;
}

  • Const는 객체의 데이터 변경을 허용하지 않는 선언이다. 이를 이용하여 멤벼변수에 저장된 값을 수정하지 않는 함수는 가급적 const 선언을 통해 const 객체에서도 호출이 가능하도록 할 필요가 있다.
  • 함수의 오버로딩이 성립하려면, 매개변수의 수 혹은 자료형의 차이를 두어야 한다. 하지만, cosnt 선언 유무 또한 함수 오버로딩 조건에 해당된다.
void SoSimple() {	.	.	.}
void SoSimple() const {	.	.	.}
  • 이렇게 될 경우 당연, 호출은 다음과 같을 것이다.
SoSimple obj1();
const SoSimple obj2();

 

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

[C++] OOP; Object-Oriented Programming  (0) 2023.10.06
[C++] Structure  (0) 2023.10.06
[C++] Class & Object  (0) 2023.10.06
[C++] Call by value / Call by reference  (0) 2023.10.06
[C++] Difference of C & C++  (0) 2023.10.06