拷贝赋值
注意事项:拷贝赋值前有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");
}