관리 메뉴

기억을 위한 기록들

[C/CPP] const란? 본문

C & CPP

[C/CPP] const란?

에드윈H 2020. 2. 27. 01:15

네이버 사전

const란 contant라는 "변함없는" 뜻을 가진 형용사에서 나온 한정사이다. 해당 키워드는 어떤 값을 상수화한다. 즉, 변경 할 수 없다는 것이다. (옛날에는 readonly 로 불렸다고 한다.)

const는 보통 자료형이나 함수에 붙이는데 자료형에 먼저 붙이는 예가 3개정도가 된다.

 

첫번째. 상수로 선언된 변수 

	int num = 5;
	
	const int cNum = num;

	cout << cNum << endl; //5출력

하지만 이제 cNum은 readOnly이므로 변경할수 없게 된다.

        int num = 5;
	
	const int cNum = num;

	cout << cNum << endl;
	
	int num2 = 10; //새로운 변수추가
	cNum = num2; //변경시도하려했으나 에러 발생

두번째. 상수를 가리키는 포인터(Pointer to const value)

 

상수를 가리키는 포인터는 상수 변수의 주소를 가리키는 포인터이다.

	const int num = 5;
	const int* ptr = &num;

	cout << *ptr << endl; //5출력

위의 ptr은 const int를 가리키고 있다. 말그대로 상수를 가리키고 있는 포인터 ptr이다.

 

여기선 문제가 없는데 아래를 보면

	int num = 5;
	const int* ptr = &num;

	cout << *ptr << endl; //5출력

여기서 ptr은 상수 변수가 아닌 일반 변수(num)를 가리키고 있다.

ptr이 가리키는 주소값 자체(&num)와, 주소값(&num)이 가리키고 있는 값(여기선 5)은 바꿀수 있다. 그리고

상수를 가리키는 포인터이기 때문에 선언과 동시에 초기화 해줄 필요는 없다.

	int num = 5;
	const int* ptr = &num;

	cout << *ptr << endl; //5출력
	
	num = 1;
	cout << *ptr << endl; //1출력

 

하지만, 역참조로 인한 값 변경은(*ptr=7) 불가능하다.

	int num = 5;
	const int* ptr = &num; // *ptr -> 5 (num의 주소값)
	cout << *ptr << endl;
	
	num = 1;              //  *ptr -> 1  (num의 주소값)
	cout << *ptr << endl;

	int num2 = 10;
	ptr = &num2; //  //  *ptr -> 10  (num2의 주소값)
    
    *ptr = 7; //컴파일 에러

 

세번째. 상수 포인터 (Const Pointer)

포인터 자체를 상수라고 생각하면 되는데, 선언은 다음과 같다.

	int num = 5;
	int* const ptr = &num;

일반 상수변수와 마찬가지로 선언과 동시에 초기화를 해줘야한다. 즉 상수 포인터는 항상 같은 주소를 가리킨다.

 

 

	int num = 5;
	int* const ptr = &num;

	cout << *ptr << endl;

	int num2 = 9;
	ptr = &num2; //불가능!

 

대신 포인터 자체가 상수일뿐이고, 가리키는 변수(num)은 상수가 아니므로 역참조(*ptr)하여 값 변경이 가능하다.

	int num = 5;
	
	int* const ptr = &num;

	cout << *ptr << endl;  //5출력 

	*ptr = 12; //역참조 12 

	cout << *ptr << endl;  //12출력 

 

 

네번째, 상수를 가리키는 상수 포인터

자료형 앞뒤에 다 const를 붙여서, 다른 주소를 가리킬수도 없고, 역참조하여 값을 변경 할 수도 없다.. 완전 봉인(?)

상수 포인터와 마찬가지로 선언과 동시에 초기화를 해주어야 한다.

	int num = 5;
	
	const int* const ptr = &num;

	cout << *ptr << endl;

4. 함수 뒤에 붙은 const

읽기 전용 함수으로 만들어 버린다. const 선언 된 함수 내에서는 값의 변경 불가능하다.

 

 

const를 뒤에 붙인 함수는 멤버 변수의 값을 변경할수 없다

 

전역의 경우

 

이런 경우도 안된다고 한다. return 된 a의     주소값으로 변경할 가능성이 있기 때문