Here is a version with comments and explanations:
#include <cmath> #include <iostream> using namespace std; class Point { private: double x, y; public: Point(); // default constructor: (0,7) Point(double x); // (x, 20) Point(double x, double y); // (y, y) Point(const Point& p); // copy constructor: (p.x+1, p.y+2) Point(Point&& p); // move constructor: (p.x-3, p.y-4) double getx () const; double gety () const; }; std::ostream& operator<<(std::ostream&, const Point&); Point::Point(): x(0.0), y(7.0){ } Point::Point(double x_coord): x(x_coord), y(20.0){ } Point::Point(double x_coord, double y_coord): x(x_coord), y(y_coord){ } Point::Point(const Point& p): x(p.x + 1.0), y(p.y + 2.0){ } Point::Point(Point&& p): x(p.x - 3.0), y(p.y - 4.0){ } double Point::getx () const{ return x; } double Point::gety () const{ return y; } std::ostream& operator<<(std::ostream& s, const Point& p){ return s << "(" << p.getx() << "," << p.gety() << ")" ; } const Point& pf(const Point& p){ cout << "Inside pf: Parameter: " << p << endl; return p; } int f(){ Point p; cout << "Point p: " << p << endl; // (0,7) cout << "pf(q): " << pf(p) << endl; // (0,7) // Passing p via const L-value reference (0,7) - no copy constructor nor rvalue constructor. // Returning a const reference: (0,7) Point q = pf(p); // Passing p via const L-value reference (0,7) - no copy constructor nor rvalue constructor. // Returning an L-value reference (0,7). Then copying it to q via copy constructor (!!). cout << "Point q: " << q << endl; // (1,9) Point r = pf(Point{10,12}); // Passing Point{10,12} as above - no copy constructor nor rvalue constructor. // Returning an L-value reference (10,12). Copying it to r via copy constructor. cout << "Point r: " << r << endl; // (11,14) } int main(){ f(); }