转自:http://patmusing.blog.163.com/blog/static/1358349602009113061024796/
#include <iostream>
using namespace std;
class Point
{
public:
int _x;
int _y;
public:
Point();
Point(int, int);
};
Point::Point()
{
_x = 0;
_y = 0;
}
Point::Point(int x, int y)
{
_x = x;
_y = y;
}
class CA
{
public:
Point* _point;
public:
CA(const Point*);
void setPointValues(int, int);
void printCoordinates();
// 需要增加的拷贝构造函数
CA(const CA&);
// 需要增加的析构函数
virtual ~CA();
// 需要增加的拷贝赋值函数
CA& operator = (const CA&);
};
CA::CA(const Point* point)
{
_point = new Point(); // 发生了动态内存分配!因此不能缺少析构函数。
_point->_x = point->_x;
_point->_y = point->_y;
}
// 需要增加的拷贝构造函数的实现
CA::CA(const CA& ca)
{
_point = new Point();
_point->_x = (ca._point)->_x;
_point->_y = (ca._point)->_y;
}
// 需要增加的析构函数的实现
CA::~CA()
{
if(!_point) delete _point;
}
// 需要增加的拷贝赋值函数的实现
CA& CA::operator = (const CA& ca)
{
_point = new Point();
_point->_x = (ca._point)->_x;
_point->_y = (ca._point)->_y;
return *this;
}
void CA::setPointValues(int x, int y)
{
_point->_x = x;
_point->_y = y;
}
void CA::printCoordinates()
{
cout << "Coordinates = (" << _point->_x << ", " << _point->_y << ")" << endl;
}
int main(void)
{
Point apoint(1, 2);
CA ca(&apoint);
ca.printCoordinates();
CA cb(ca); // 调用拷贝构造函数
cb.printCoordinates();
cb.setPointValues(12, 12);
cb.printCoordinates();
ca.printCoordinates();
CA cc = cb; // 调用拷贝赋值函数
cc.printCoordinates();
cc.setPointValues(13, 13);
ca.printCoordinates();
cb.printCoordinates();
cc.printCoordinates();
return 0;
}