1. const
C++에서 상수를 정의하거나, 변수나 객체의 값을 상수화하기 위해 사용하는 대표적인 키워드이다. 기본적인 사용법은 다음과 같다.
// 1. 상수 변수
const int MAX_VALUE = 100;
// 2. 상수 포인터
int value = 10;
const int* ptr = &value; // 포인터가 가리키는 값을 변경할 수 없음
int* const ptr2 = &value; // 포인터 자체를 변경할 수 없음
const int* const ptr3 = &value; // 포인터와 가리키는 값을 모두 변경할 수 없음
// 3. 상수 멤버 함수
class MyClass {
public:
// 멤버 변수 value를 변경할 수 없음
int getValue() const {
return value;
}
private:
int value;
};
// 4. 상수 참조
void printValue(const int& value) {
// 함수 내부에서 인자의 값을 변경할 수 없음
std::cout << value << std::endl;
}
// 5. 상수 반환 값
const int getValue() {
return 42;
}
2. constexpr(C++11)
constexpr
키워드는 C++11에서 도입되었다. const
와 마찬가지로 상수화하기 위해 사용할 수 있는데, 목적과 사용 방식에 차이가 있다.
const
변수나 객체의 값을 상수화하기 위해 사용한다. 하지만 const
의 수식을 받는 변수, 객체는 반드시 컴파일 시간에 상수로 평가되지 않아도 된다.
const int MAX_VALUE = 100; // ok
int num;
std::cin >> num;
const int CONST_NUM = num; // ok
constexpr
컴파일 시간에 상수로 평가될 수 있는 표현식을 정의하기 위해 사용한다. constexpr
의 수식을 받는 변수는 반드시 컴파일 시간에 상수로 평가되어야 하고(필수), constexpr
의 수식을 받는 함수는 컴파일 시간에 평가될 수 있는 함수로 정의되어야 한다.(필수 아님)
constexpr int MAX_VALUE = 100; // ok
int num = 5;
constexpr int CONST_NUM = num; // not ok!!, CONST_NUM에 할당하는 값인 num은 아직 초기화되지 않음
constexpr int GetSquare(int x) {
return x*x;
}
constexpr int SQUARE_VALUE = GetSquare(10);
3. consteval(C++20)
consteval
키워드는 함수가 반드시 컴파일 시간에 평가되어야 함을 명시한다. consteval
함수는 항상 상수 표현식으로 평가되며, 런타임에 호출할 수 없다. 따라서 컴파일 시간에 상수로 평가되는 값을 생성할 때 유용하게 사용할 수 있다.
constexpr
constepxr
함수는 컴파일 시간에 평가될 수도 있지만, 반드시 컴파일 시간에 평가될 필요는 없다.
consteval
consteval
함수는 반드시 컴파일 시간에 평가되어야 한다. 런타임에는 호출할 수 없다.
// constexpr 사용
constexpr int getSquare(int x) {
return x * x;
}
constexpr int value = getSquare(5); // 컴파일 시간에 평가됨
int runtimeValue = getSquare(5); // 런타임에 평가됨
// consteval 사용
consteval int getSquare(int x) {
return x * x;
}
constexpr int value = getSquare(5); // 컴파일 시간에 평가됨
// int runtimeValue = getSquare(5); // 오류: consteval 함수는 런타임에 호출될 수 없음
'프로그래밍 언어 > C++' 카테고리의 다른 글
ImGui 기본 사용법 (0) | 2024.09.09 |
---|---|
std::vector의 emplace, emplace_back 사용시 주의사항 (0) | 2024.09.09 |
환경설정(vcpkg 설치) (0) | 2023.04.28 |
함수 오버로딩과 포인터 (0) | 2023.04.03 |
포인터와 const (0) | 2023.03.31 |