// ... (continuation of ArrayStack) ArrayStack(const ArrayStack& st); // copy constructor // assignment operator constructor ArrayStack& operator=(const ArrayStack& st); ~ArrayStack() // destructor { delete [] S; } }; template <typename Object> // copy constructor ArrayStack<Object>:: ArrayStack(const ArrayStack& st) { capacity = st.capacity; t = st.t; S = new Object[capacity]; for (int i = 0; i <= t; i++) { // copy contents S[i] = st.S[i]; } } template <typename Object> // assignment operator ArrayStack<Object>& ArrayStack<Object>:: operator=(const ArrayStack& st) { if (this != &st) { // avoid self copy (x = x) delete [] S; // delete old contents capacity = st.capacity; t = st.t; S = new Object[capacity]; for (int i = 0; i <= t; i++) { // copy contents S[i] = st.S[i]; } } return *this; }