์ผ๋ฐ์ ์ธ ์๋ฏธ๋ก const : ์์
constexpr : ์ปดํ์ผ ํ์ ์์(์ปดํ์ผ ์์ ์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ผ๋ฉด ์๋ฌ)
constexpr์ ๋ชจ๋ const์ด์ง๋ง ๋ฐ๋๋ ์ฑ๋ฆฝ X
class conT{
private:
const int v;ย
//const int sV;ย
static constexpr int sV=20000; //static์ด ์๋๋ฉด ์๋ฌ,์ด๊ธฐํ ๋ฆฌ์คํธ๋ก ์ด๊ธฐํ ๋ถ๊ฐ
public:ย
//conT(int x) :v(x),sV(30000) {};ย
conT(int x) :v(x) {};
void printV(void);
};
void conT::printV(void)
{
cout << "This v is " << v << "ย !! " << sV << " @@@ " << endl;
}
int main(void)
{
int y=0;
cinย >> y;
conT t1(100 * y), t2(200 * y); //const V๋ ๋ช
์์ ์ผ๋ก runtime์ ์ด๊ธฐํ
t1.printV();
t2.printV();
return 0;
}
//์ด๋ค ๋ณ์์ ๊ฐ์ ๋ฐ๋์ ์ปดํ์ผ ์์ ์ ์์๋ก ์ฌ์ฉํด์ผ ํ๋ค๋ฉด constexpr๋ฅผ ์ฌ์ฉํ๋ผ! constexpr๋ก ๊ฐ์ฒด๋ฅผ ์ ์ธํ์๋-> ์ปดํ์ผ ํ์์ ๊ฐ์ฒด๊ฐ์ด ์ ํด์ ธ์ผํ๋ค.
constexpr๋ก ํจ์๊ฐ ์ ์ธ๋์์ ? 2๊ฐ์ง ์ฉ๋
- constexpr ํจ์์ ์ธ์๊ฐ ์ปดํ์ผ ์์ ์ ์๋ ค์ก์๋? ์ปดํ์ผ์ ๊ณ์ฐ!
- ์๋ ค์ง์ง ์๋ ํ๋์ด์์ ๊ฐ๋ค๋ก constexpr ํจ์ ํธ์ถ? ๋ณดํตํจ์์ฒ๋ผ ์๋(๋ฐํ์์ ๊ณ์ฐ) ๊ฒฐ๊ตญ ์ปดํ์ผ ํ์์ ๊ณ์ฐํ ์๋ ์๋ ํจ์์ด๋ค ๋ผ๋ ์๋ฏธ
constexpr int conX = 100, conY = 200;
int runX = 1, runY = 2;
constexpr int consAdd(int x, int y)
{
return x + y;
}
int main(void)
{
cout << "input_ ";ย cinย >> runY;ย //
cout << consAdd(conX, conY) << endl;ย //compile time ๊ณ์ฐ
cout << consAdd(runX, runY) << endl;ย //run timeย
cout << consAdd(conX, runY) << endl;ย //run timeย
return 0;
}
constexpr๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ๊ทธ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ constexpr ํจ์ ์์
class Point {
public:
constexpr Point(double xVal = 0, double yVal = 0) noexceptย ย : x(xVal), y(yVal)ย {}
constexpr double xValue() const noexcept { return x; }
constexpr double xYalue() const noexcept { return y; }
void setX(double newX) noexcept { x = newX; }
void setY(double newY) noexcept {y = newY; }
private:ย
double x, y;
};
constexpr Point p1(9.5, 27.7);ย
constexpr Point p2(28.8, 5.3);
constexpr Point midpoint(const Point& p1, const Point& p2) noexcept
{
return {(p1.xValue() + p2.xValue()) / 2 , (p1.xYalue() + p2.xYalue()) / 2 };ย //constexpr ๋ฉค๋ฒํจ์๋ค์ ํธ์ถ
}
constexpr auto mid = midpoint(p1, p2);//๋ชจ๋ ์ปดํ์ผ ํ์์ ๊ณ์ฐ๋๋ค.
์ ์ฝ์ฌํญ
- constexpr ํจ์๋ literal type(์ปดํ์ผ ๋์ค์ ๊ฐ์ ๊ฒฐ์ ํ ์ ์๋ํ์) ๋ง ๋ฆฌํด ๋ฐ์์ ์๋ค.
- c++11์์๋ constexpr ํจ์๋ ์ต๋ ํ์ค๋ง ํ์ฉํ๋ค(return ํฌํจํด์). ๊ทธ๋ฆฌ๊ณ void๊ฐ literal type ์ด ์๋(void ๋ฆฌํด๋ถ๊ฐ,์์ฑ์์ ์ธ)
- c++14์์๋ c++11์ ์ ์ฝ์ด ์ฌ๋ผ์ง.(class ๋ฉค๋ฒ๋ณ์ setํจ์(void๋ฅผ ๋ฆฌํดํ๋)๋ฅผ constexpr ํจ์๋ก ๋ง๋ค์ ์๋ค)
- constexpr ๋ด์์ ์ ์ถ๋ ฅ์ X
c++14์์๋ constexpr ํจ์ void๋ฆฌํด์ด ๊ฐ๋ฅํ๋ฏ๋ก x,y์ ๋ํ set constexpr ํจ์๋ฅผ ๋ง๋ค์ ์๋ค.
ex)
//๋์นญ์
constexpr Point reflection(const Point& p) noexcept
{
Point result;ย ย ย ย //๋น const Point๋ฅผ ์์ฑ
result.setX(-p.xValue());
result.setY(-p.yValue());
return result;ย ย ย ย //๋ณต์ฌ๋ณธ๋ฆฌํด
}
constexpr auto reflectedMid = reflectedMid(mid);
constexpr์ ๊ฐ์ฒด๋ ํจ์์ ์ธํฐํ์ด์ค์ ์ผ๋ถ์ด๋ค. ๋๊ตฐ๊ฐ๊ฐ constexpr์ ์ ๊ฑฐํ๋ฉด ๋์์ ๋ณด์ฅ ๋ชปํ๋ค. constexpr๋ฅผ ๊ฐ๋ฅํ ํญ์ ์ฌ์ฉํ๋ค๋๊ฒ์ ์ธํฐํ์ด์ค(ํจ์,๊ฐ์ฒด ์ ์ฝ)๋ค๋ฅผ ์ต๋ํ ์ค๋ ์ ์งํ๊ฒ ๋ค๋ ์๋ฏธ๋ฅผํฌํจํ๋ค๊ณ ๋ณผ์ ์๋ค.(์ ์์ฃผ)