注意事项:拷贝赋值前有new一个空间记得在拷贝赋值时清空,详细看代码
#include<iostream> #include<string> using namespace std; class MyClass { friend ostream& operator<<(ostream &in, const MyClass& a1);//cout的读取 public: MyClass(int size)//构造一个空间 { cout << "构造"<< endl; m_array=new int[size]; m_size=size; } MyClass(const MyClass &arr)//拷贝数组 { cout << "拷贝构造" << endl; m_array = new int[arr.m_size];//new一个空间传递数组 /* memcpy内存拷贝(dest新缓冲区,src从中进行复制操作的缓冲区,count要复制的字符数。 arr.m_size*sizeof(arr.m_array[0])读取字符数 memcpy 将字节 count 从 复制到 src dest ; 返回值为dest */ memcpy(m_array, arr.m_array, arr.m_size*sizeof(arr.m_array[0])); m_size = arr.m_size; } MyClass& operator=(const MyClass &tate)//相当于重新拷贝构造一遍 { if (&tate != this)//判断是否重复拷贝赋值自己 { if (this->m_array)//判断是否为空,清空上一次new的一个空间 { delete[] m_array; m_array = NULL; } //拷贝赋值和拷贝构造差不多,但是之前如果有new一个空间必须清空。 //拷贝*pless1就是重新给值然后赋值到*pless2。 cout << "拷贝赋值" << endl; m_array = new int[tate.m_size]; memcpy(m_array, tate.m_array, tate.m_size*sizeof(tate.m_array[0])); m_size = tate.m_size; return *this; } cout << "拷贝构造自己" << endl; return *this; } int &at(int index)//接收数组 { return m_array[index]; } size_t size()//返回数组 { return m_size; } ~MyClass()//析构 { if (m_array){ delete[] m_array; m_array = NULL; } } private: int *m_array; size_t m_size; }; ostream& operator<<(ostream &in, const MyClass& a1)//输出 { for (int i = 0; i < a1.m_size; ++i) { in << a1.m_array[i] << ' '; } in << endl; return in; } int main() { //构造函数 MyClass *pless1 = new MyClass(4); for (int i = 0; i < pless1->size(); ++i) { pless1->at(i) = i;//赋值 } cout << *pless1 << endl; //拷贝构造 MyClass* pless2 = new MyClass(*pless1); cout << *pless2 << endl; //拷贝赋值 *pless2 = *pless1; cout << *pless2 << endl; //拷贝赋值自己 *pless2 = *pless2; cout << *pless2 << endl; system("pause"); }