Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'                constexpr/constexpr-3.cpp - Examples of class Circle with a constexpr constructor - C++11.Lecture 6 - slide 33 : 40
Program 7

// Illustrates class circle with aconstexpr constructors and constexpr member functions.
// Compiles without errors.

#include <iostream>

constexpr double square(double x){
  return x * x;
}

constexpr double PI = 3.14159;

class Circle {
  private:
    double cx, cy;
    double radius;

  public:
    constexpr Circle(double x, double y, double r) : cx{x}, cy{y}, radius{r}{
    }

    constexpr Circle(const Circle& c) : cx(c.cx), cy(c.cy), radius(c.radius){
    }

    constexpr double area(){
      return square(radius) * PI;
    }

    constexpr Circle move(double dx, double dy){
      return Circle(cx+dx, cy+dy, radius);
    }

    constexpr double x(){return cx;}
    constexpr double y(){return cy;}
    constexpr double r(){return radius;}
};

// Compile time use of class circle:
constexpr Circle C1{1.1, 2.2, 4.0},
                 C2 = C1.move(0.9, 0.8);

constexpr double C1_Area = C1.area();
static_assert(C1_Area == 4.0 * 4.0 * PI, "Expected vaue of C1_Areal is 4.0 * 4.0 * PI");
// End of compile time use of class Circle.

int main(){
  using namespace std;

  cout << "C1: " << C1.area() << endl;  // 50.2654
  cout << "C2: " << C2.area() << endl;  // 50.2654

//  cout << C1.cx << " " << C1.cy << " " << C1.radius << endl;     // Error - access to private variables.
//  cout << C2.cx << " " << C2.cy << " " << C2.radius << endl;     // Error - access to private variables.

  cout << C1.x() << " " << C1.y() << " " << C1.r() << endl;        // 1.1 2.2 4
  cout << C2.x() << " " << C2.y() << " " << C2.r() << endl;        // 2 3 4

  // Run time use of class Circle:
  Circle *pc1{new Circle(10, 20, 5)};
  Circle c2 = pc1->move(1,-1);
  Circle c3{C2};                                       // Constructing c3 based on compile time constructed C2.
  cout << "*pc1: " << pc1->x() << " " << pc1->y() << " " << pc1->r() << endl;       // *pc1: 10 20 5
  cout << "c2: " << c2.x() << " " << c2.y() << " " << c2.r() << endl;               // c2: 11 19 5
  cout << "c3: " << c3.x() << " " << c3.y() << " " << c3.r() << endl;               // c3: 2 3 4
  delete pc1;
  // End of run time use of class Circle.

}