Skip to content

Latest commit

ย 

History

History
109 lines (92 loc) ยท 3.72 KB

File metadata and controls

109 lines (92 loc) ยท 3.72 KB

์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ๋กœ 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๊ฐ€์ง€ ์šฉ๋„

  1. constexpr ํ•จ์ˆ˜์˜ ์ธ์ž๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ๋ ค์กŒ์„๋•Œ? ์ปดํŒŒ์ผ์‹œ ๊ณ„์‚ฐ!
  2. ์•Œ๋ ค์ง€์ง€ ์•Š๋Š” ํ•˜๋‚˜์ด์ƒ์˜ ๊ฐ’๋“ค๋กœ 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๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•ญ์ƒ ์‚ฌ์šฉํ•œ๋‹ค๋Š”๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค(ํ•จ์ˆ˜,๊ฐ์ฒด ์ œ์•ฝ)๋“ค๋ฅผ ์ตœ๋Œ€ํ•œ ์˜ค๋ž˜ ์œ ์ง€ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋ฅผํฌํ•จํ•œ๋‹ค๊ณ  ๋ณผ์ˆ˜ ์žˆ๋‹ค.(์ €์ž์ฃผ)