// ==========================================================================
// $Id: construct_example.cpp,v 1.2 2008/10/15 19:18:59 jlang Exp $
// CSI2372 example Code for lecture 5
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   SITE, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada. 
//   http://www.site.uottawa.ca
// 
// Creator: jlang (Jochen Lang)
// Email:   jlang@site.uottawa.ca
// ==========================================================================
// $Log: construct_example.cpp,v $
// Revision 1.2  2008/10/15 19:18:59  jlang
// Added construction via temporary
//
// Revision 1.1  2006/10/02 01:52:09  jlang
// More constructor examples added
//
// Revision 1.1  2006/09/23 00:00:55  jlang
//
// ==========================================================================
#include <iostream>

using std::cout;
using std::endl;

class Point2D {
  double d_x;
  double d_y;
public:
  Point2D( double _x=0.0, double _y=0.0 );
  Point2D( const Point2D& _oPoint );
};

/**
 * Point2D - All argument constructor
 */
Point2D::Point2D( double _x, double _y ) {
  d_x = _x;
  d_y = _y;
  cout << "Executing var. arg. constructor!" << endl;
}

/**
 * Point2D - copy constructor
 * Same as synthesized -- for print statement only
 */
Point2D::Point2D( const Point2D& _oPoint )
  : d_x( _oPoint.d_x ), d_y( _oPoint.d_y ) {
  cout << "Executing copy constructor!" << endl;
}

int main() {
  cout << "Various calls to constructors: " << endl;
  // call to default constructor
  Point2D pt1; 
  // via temporary
  Point2D p4 = Point2D();
  // call to copy constructor
  Point2D pt2 = pt1;    
  // call to copy constructor but no temporary
  Point2D pt3(pt1);
}
