// Illustrates class circle with aconstexpr constructors and constexpr member functions. // Compiles without errors. #include 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. }