const
컴파일러 상수(*상수 : 정적인 data. 초기화를 한번밖에 못하는 data. 메모리 변경이 불가하다).
변수를 상수화하여, 한번 할당된 상수로 할당된 메모리의 모든 비트를 변경하지 못한다.
const가 붙은 변수는 선언과 초기화를 동시에 해주어야한다.
const int num;
int const num;
이 두개는 같음
int a = 10;
int b = 5;
const int *ptr1 = &b;
cout << "변경되기전 : ";
cout << *ptr1 << endl;
cout << ptr1 << endl;
ptr1 = &a;
cout << "변경된 후 : ";
cout << *ptr1 << endl;
cout << ptr1 << endl;
ptr1이 가르키는 값은 변경할수없지만 주소값을 바꿔주었더니 값이 변경되었다.
(const로 상수 취급을 하지만 정말 완벽한 상수가 아니다, 또한 포인터로 강제로 값을 바꾸는 게 좋은 방법이 아니다.)
- 가장 큰 차이는 const / constexpr 는 메모리를 할당받고, #define은 메모리를 차지하지 않는다.
#define 메모리에 할당되지 않음 , type을 기록하지 않음
constexpr 할당 시기는 컴파일 타임 때 확정되어야 한다
const 할당 시기는 컴파일 / 런타임 상관 없다.
constepxr int a = 100;
void fun(int n)
{
constexpr int var1 = a + 4; // a 가 컴파일 타임 때 확정되기 때문에 가능
constexpr int var2 = n + 4; // n 이 어떤 값인지 확저외지 않으므로 에러
const int var3 = n + 4;
}
constexpr은 파일 타임에 정해져야 하는 값이 정해지지 않은 채로 컴파일을 시도할 때, 좀 더 느린 동작을 하는 함수를 실행시키게 되는게 아니라 아예 컴파일 에러를 발생
전처리 단계에서 진행이 되는 #define을 디버깅해서 볼 때는, 결코 찾아볼 수 없다.
이유는 이미 컴파일을 진행할 당시 define에 정의한 변수들이 전부 define의 값으로 치환되어서 컴파일이 진행되었기에 이를 찾아볼 수 없는 것이다.
디버깅 하기 어렵기 때문에 #define을 추천하지 않는 것
메모리를 할당받은 const 값에는 계산된 7 이라는 값이 들어가지만
#define 에는 그대로 2+5 가 들어가는것을 볼 수 있음
#define TEST_VARIABLE_DEFINE 2+5
const int TEST_VARIABLE_CONST = 2+5;
using namespace std;
int main(void) {
cout << TEST_VARIABLE_DEFINE * 6 << endl;
cout << TEST_VARIABLE_CONST * 6 << endl;
return 0;
}
//
32 (2 + 5 * 6)
35 (7 * 6)
'프로그래밍 > C++' 카테고리의 다른 글
this 포인터, 연산자 오버로딩 (0) | 2022.04.15 |
---|---|
멤버 초기화 리스트, 이니셜라이저 (0) | 2022.04.13 |
C++ 상속 (0) | 2022.04.08 |
NULL / nullptr (0) | 2022.03.18 |
virtual, override (0) | 2022.03.16 |