| 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.
}