注意: C++中, 重载赋值运算符函数 只能作为类的成员函数

    c++编译器至少给一个类添加4个函数

    1. 默认构造函数(无参,函数体为空)
    2. 默认析构函数(无参,函数体为空)
    3. 默认拷贝构造函数,对属性进行值拷贝
    4. 赋值运算符 operator=, 对属性进行值拷贝

    如果类中有属性指向的是堆区,那么做赋值操作的时候也会出现深浅拷贝的问题。
    而编译器给我们提供的赋值运算进行的是浅拷贝,深拷贝需要我们手动写代码实现

    代码

    1. class Person
    2. {
    3. public:
    4. Person(int age)
    5. {
    6. //将年龄数据开辟到堆区
    7. m_Age = new int(age);
    8. }
    9. //重载赋值运算符
    10. Person& operator=(Person &p)
    11. {
    12. if (m_Age != NULL)
    13. {
    14. delete m_Age;
    15. m_Age = NULL;
    16. }
    17. //编译器提供的代码是浅拷贝
    18. //m_Age = p.m_Age;
    19. //提供深拷贝 解决浅拷贝的问题
    20. m_Age = new int(*p.m_Age);
    21. //返回自身
    22. return *this;
    23. }
    24. ~Person()
    25. {
    26. if (m_Age != NULL)
    27. {
    28. delete m_Age;
    29. m_Age = NULL;
    30. }
    31. }
    32. //年龄的指针
    33. int *m_Age;
    34. };
    35. void test01()
    36. {
    37. Person p1(18);
    38. Person p2(20);
    39. Person p3(30);
    40. p3 = p2 = p1; //赋值操作
    41. cout << "p1的年龄为:" << *p1.m_Age << endl;
    42. cout << "p2的年龄为:" << *p2.m_Age << endl;
    43. cout << "p3的年龄为:" << *p3.m_Age << endl;
    44. }
    45. int main() {
    46. test01();
    47. //int a = 10;
    48. //int b = 20;
    49. //int c = 30;
    50. //c = b = a;
    51. //cout << "a = " << a << endl;
    52. //cout << "b = " << b << endl;
    53. //cout << "c = " << c << endl;
    54. system("pause");
    55. return 0;
    56. }