#include <iostream>
using namespace std;

class Point
{
    int x, y;
public:
    //构造函数,
    Point(int ix = 0, int iy = 0)
        :x(ix), y(iy)
    {
        cout << endl << "Point(" << x << "," << y << ") is called!";
    }
    //析构函数,
    ~Point()
    {
        cout << endl << "~Point(" << x << "," << y << ") is called!";
    }
    //友元输出函数,
    friend ostream& operator<<(ostream&, const Point&);
    //operator =操作符重载,
    Point& operator =(const Point& pt)
    {
        cout << endl << "Point operator= is called!";
        x = pt.x; y = pt.y;
        return *this;
    }
};

ostream& operator<<(ostream& on, const Point& pt)
{
    return cout << "(" << pt.x << "," << pt.y << ")";
}

template <typename T>
class DynamicArray {
private:
    T* array; //pointer  ,一个T类型的指针
    unsigned int mallocSize; //分配空间的大小。
public:
    //Constructors 
    DynamicArray(unsigned length, const T &content); // mallocSize=length; 设置每个元素的初始内容是 content;
    //Copy Constructor 
    DynamicArray(const DynamicArray<T> & anotherDA);
    // Destructors
    ~DynamicArray();

    //return the this->mallocSize
    unsigned int capacity() const { return this->mallocSize; }
    // for the array[i]=someT.
    T& operator[](unsigned int i) { return this->array[i]; }
    //自己定义个operator[]  const 重载
    T& operator[](unsigned int i) const { return this->array[i]; }
    //自己定义个 operator = 重载
    DynamicArray<T> & operator= (const DynamicArray<T> & anotherDA);
};

template <typename T>
DynamicArray<T>::DynamicArray(unsigned length, const T &content)
{
    this->array = new T[length];
    this->mallocSize = length;
    for (int i = length; i-- > 0;){
        this->array[i] = content;
    }
}

template <typename T>
DynamicArray<T>::DynamicArray(const DynamicArray<T> & a)
{
    this->mallocSize = a.capacity();
    this->array = new T[a.capacity()];
    for (int i = a.capacity(); i-- > 0;){
        this->array[i] = a[i];
    }
}

template <typename T>
DynamicArray<T>::~DynamicArray()
{
    if (this->array){
        delete[] this->array;
        this->array = 0;
        this->mallocSize = 0;
    }
}

template <typename T>
DynamicArray<T>& DynamicArray<T>::operator=(const DynamicArray<T> &a)
{
    this->~DynamicArray<T>();

    this->mallocSize = a.capacity();
    this->array = new T[a.capacity()];
    for (int i = a.capacity(); i-- > 0;){
        this->array[i] = a[i];
    }
    return *this;
}

//StudybarCommentBegin
int main()
{
    int length, i;
    cin >> length;
    DynamicArray<double> iarray0(length, 3.14);
    DynamicArray<Point> iarray(length, Point(3));
    DynamicArray<Point> iarray2(iarray), iarray3(iarray2);

    for (i = 0; i < length; i++) {
        cout << endl << iarray3[i] << " ";
        cout << iarray0[i];
        iarray[i] = Point(i, i + 1);
    }
    iarray3 = iarray2 = iarray;
    cout << endl;
    for (i = 0; i < length; i++) {
        cout << iarray3[i] << " ";
    }

    return 0;
}
//StudybarCommentEnd