출처 : 시작하자! C++17 프로그래밍
/*
constexpr 지정자로 선언된 생성자는 클래스를 단순화시키는 동시에 객체 생성과 동시에
멤버 변수를 초기화시킬 목적으로 사용한다.
사용법 ::
1. constexpr 데이터-타입 상수-이름 = 식
2. constexpr 데이터-타입 상수-이름(식)
3. constexpr 데이터 타입 함수 이름(인수)
4. constexpr 생성자(인수)
*/
#include <iostream>
struct complex
{
constexpr complex(double r, double i) : re(r), im(i) {}
constexpr double real() const { return re; }
constexpr double imag() const { return im; }
private:
double re;
double im;
};
constexpr double square(double x) { return x*x; }
int main()
{
// 인수로 리터럴 사용했으므로 사용가능. comp 변수는 상수로 사용된다.
constexpr complex comp(0.0, 1.0);
double x = 1.0;
// constexpr 지정자로 선언된 변수는 상수를 의미하므로 에러 발생
// constexpr complex cx1(x, 0);
// 상수표현식으로 선언된 생성자는 인라인 함수로 인식되므로 일반 객체 생성하는데 문제 X
complex cx1(x, 10);
// cx2 변수는 const 상수로 선언되어 있기 때문에 허용
const complex cx2(x, 1);
int var = 17;
const int dmv = 17;
constexpr double max1 = 1.4 * square(dmv);
// 오류 발생 var 이 함수의 인자로 상수가 아닌 변수를 사용했기 때문에.
// constexpr double max2 = 1.4 * square(var);
// const 상수는 변수를 사용하더라도 변수가 초기화 되어있으면 가능
const double max3 = 1.4 * square(var);
return 0;
}
/*
constexpr 상수와 const 상수의 차이점은 다음과 같음.
- 상수표현식 상수는 컴파일하는 시점부터 상수로 인식
- const 상수는 프로그램이 실행되는 시점부터 상수로 인식
- 상수표현식 지정자는 성능을 보장하기 위해 사용
- const 지정자는 안정성을 확보하기 위해 사용
*/
인라인 함수나 일반 함수 그리고 생성자를 사용하기에 앞서서 성능 향상에 도움이 되는 상수표현식을 사용하는 것이 좋다고 한다.
반응형