注意内置类型时,使用memcpy没问题,在拷贝构造和赋值运算符重载时;
而在自定义类型时(string),必须用类型的operator=拷贝,否则会崩溃(使用了已释放的内存_ptr,调用delete时会调其析构函数)
#include<iostream> #include<string> using namespace std; template<typename T> class SeqList { public: SeqList(); SeqList(const SeqList<T>& s); SeqList<T>& operator=(const SeqList<T>& s); ~SeqList(); void PushBack(const T& data); void PopBack(); void Print(); protected: void _CheckCapacity(int capacity) { if (capacity > _capacity) { _capacity = capacity * 2 + 3; Destory(_data); _data = new T[_capacity]; } } void Destory(T*& _data) { if (_data != NULL) { delete[] _data; _data = NULL; } } protected: T* _data; int _capacity; int _size; }; template<class T> SeqList<T>::SeqList() :_data(NULL) , _capacity(0) , _size(0) { } template<class T> SeqList<T>::SeqList(const SeqList<T>& s) :_data(new T[s._capacity]) , _capacity(s._capacity) , _size(s._size) { //memcpy(_data, s._data,s._size*sizeof(T));//有副作用,如果是自定义类型的话,指针指向_ptr的是浅拷贝(释放后还使用) for (int i = 0; i < s._size; i++) { _data[i] = s._data[i];//operator= } } //或者形参为SeqList<T> s临时变量,交换_data,出了作用域自己释放 template<class T> SeqList<T>& SeqList<T>:: operator=(const SeqList<T>& s) { if (this != &s) { _Destroy(this->_data); _data = new T[s._capacity]; // memcpy(_data, s._data,s._size*sizeof(T));//内置类型使用memcpy for (int i = 0; i < s._size; i++) { _data[i] = s._data[i];//operator= } _capacity = s._capacity; _size = s._size; } return *this; } template<class T> SeqList<T>:: ~SeqList() { Destory(_data); } template<class T> void SeqList<T>::PushBack(const T& data) { int capacity = _size + 1; _CheckCapacity(capacity); _data[_size++] = data; } template<class T> void SeqList<T>::PopBack() { if (_size>0) _size--; } template<class T> void SeqList<T>::Print() { for (int i = 0; i<_size; ++i) { cout << _data[i] << " "; } cout << endl; } void Test1() { SeqList<int> s; s.PushBack(1); s.PushBack(2); s.PushBack(3); s.PushBack(4); s.PushBack(5); s.Print(); SeqList<int> s1; s1 = s; s1.Print(); } void Test2() { SeqList<string> l; l.PushBack("abc"); l.PushBack("dlllllllllllllllllllllllllllllef"); l.PushBack("jkl"); l.PushBack("lwdw"); l.Print(); SeqList<string> s(l); s = l; s.Print(); } int main() { Test2(); system("pause"); return 0; }