比如类Add,Add A=B:
1、当新声明一个对象并赋初始值时,使用=时,编译器会默认,将B的成员变量,拷贝赋值给B,使用的是浅拷贝,该函数自己不写到类内部时,编译器会默认隐式自带;
Add(const Add& n)
2、假如类内部没有成员是指针类型,编译器的默认拷贝赋值是没有问题的,使用的浅拷贝;
3、假如类内部有成员是指针类型,那么编译器再使用浅拷贝,拷贝指针成员时,仅会将该指针的的值拷贝赋值给目的对象,而指针指向的空间内的数据,不会被拷贝;
这个时候,编译器默认自带的拷贝赋值函数,就不能满足要求,这个时候就需要我们自己,自定义改写这个函数Add(const Add& n);
4、我们写的类成员函数void operator=(Add n),在什么情况下才会被调用呢,只有在前面类对象已经存在,再次拷贝赋值的时候才会调用;
总结:假设B已提前存在
①、
Add A=B:
调用 Add(const Add& n);
②、
Add A;
A = B;
调用 void operator=(Add n);
#include <iostream>using namespace std;class Add
{
public:Add(int n){m_Num = new int;*m_Num = n;}Add(const Add& AA){if(AA.m_Num){m_Num = new int;*m_Num = *AA.m_Num;}else{m_Num = nullptr;}}Add& operator=(Add& AA){if (this == &AA){return *this;}if (AA.m_Num){delete m_Num;m_Num = new int;*m_Num = *AA.m_Num;}else{m_Num = nullptr;}return *this;}~Add(){if (m_Num != NULL){delete m_Num;m_Num = NULL;}}int* m_Num;
};void test01()
{Add n1(10);Add n2(20);n1 = n2;Add n3 = n2;cout << *n1.m_Num << endl;}
int main()
{test01();return 0;
}
显然,编译器默认的隐式拷贝构造函数是不能满足我们的需要的,那么这时,就需要我们自己写拷贝赋值函数了: