일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- UELOG
- moreeffectiveC++
- 언리얼엔진구조체
- unorder_map
- C++최적화
- 알고리즘
- 약참조
- map
- 애셋로드
- UML관련
- 언리얼가비지컬렉터
- 크리티컬섹션
- 람다
- enumasByue
- 프로그래머스
- stl
- 데이터애셋
- UE_LOG
- 선택정렬
- UE4 커스텀로그
- 정렬
- 자료구조
- BFS
- dataasset
- C++
- 스마트포인터
- 델리게이트
- 강참조
- 람다사용정렬
- 정렬알고리즘
- Today
- Total
기억을 위한 기록들
[C/CPP] const란? 본문
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 = #
cout << *ptr << endl; //5출력
위의 ptr은 const int를 가리키고 있다. 말그대로 상수를 가리키고 있는 포인터 ptr이다.
여기선 문제가 없는데 아래를 보면
int num = 5;
const int* ptr = #
cout << *ptr << endl; //5출력
여기서 ptr은 상수 변수가 아닌 일반 변수(num)를 가리키고 있다.
ptr이 가리키는 주소값 자체(&num)와, 주소값(&num)이 가리키고 있는 값(여기선 5)은 바꿀수 있다. 그리고
상수를 가리키는 포인터이기 때문에 선언과 동시에 초기화 해줄 필요는 없다.
int num = 5;
const int* ptr = #
cout << *ptr << endl; //5출력
num = 1;
cout << *ptr << endl; //1출력
하지만, 역참조로 인한 값 변경은(*ptr=7) 불가능하다.
int num = 5;
const int* ptr = # // *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 = #
일반 상수변수와 마찬가지로 선언과 동시에 초기화를 해줘야한다. 즉 상수 포인터는 항상 같은 주소를 가리킨다.
int num = 5;
int* const ptr = #
cout << *ptr << endl;
int num2 = 9;
ptr = &num2; //불가능!
대신 포인터 자체가 상수일뿐이고, 가리키는 변수(num)은 상수가 아니므로 역참조(*ptr)하여 값 변경이 가능하다.
int num = 5;
int* const ptr = #
cout << *ptr << endl; //5출력
*ptr = 12; //역참조 12
cout << *ptr << endl; //12출력
네번째, 상수를 가리키는 상수 포인터
자료형 앞뒤에 다 const를 붙여서, 다른 주소를 가리킬수도 없고, 역참조하여 값을 변경 할 수도 없다.. 완전 봉인(?)
상수 포인터와 마찬가지로 선언과 동시에 초기화를 해주어야 한다.
int num = 5;
const int* const ptr = #
cout << *ptr << endl;
4. 함수 뒤에 붙은 const
읽기 전용 함수으로 만들어 버린다. const 선언 된 함수 내에서는 값의 변경 불가능하다.
'C & CPP' 카테고리의 다른 글
STL컨테이너 2가지(시퀀스 컨테이너/연관 컨테이너) (0) | 2020.08.18 |
---|---|
Iterator(반복자)의 작성 방법 3가지 (0) | 2020.08.07 |
CPP Reference 참고용 사이트 (영문) (0) | 2020.08.07 |
함수포인터 + 함수포인터 별칭(콜백함수/고계함수) (0) | 2020.04.01 |
CPP - explicit (0) | 2020.01.26 |