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