4、赋值运算符重载.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //4.5.4 赋值运算符重载
  2. //C++编译器至少给一个类添加4个函数
  3. //1、默认构造函数(无参,函数体为空)
  4. //2、默认析构函数(无参,函数体为空)
  5. //3、默认拷贝构造函数,对属性进行值拷贝
  6. //4、赋值运算符operator= , 对属性进行值拷贝
  7. //如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题
  8. #if(0)
  9. #include <iostream>
  10. class Person
  11. {
  12. public:
  13. Person(int age)
  14. {
  15. m_Age = new int(age);
  16. }
  17. ~Person()
  18. {
  19. if (m_Age != NULL)
  20. {
  21. delete m_Age;
  22. m_Age = NULL;
  23. }
  24. }
  25. //重载 赋值运算符
  26. Person& operator=(Person &p)
  27. {
  28. //编译器是提供的浅拷贝
  29. //m_Age = p.m_Age;
  30. //应该先判断是否有属性在堆区,如果有先释放干净,再深拷贝
  31. if (m_Age != NULL)
  32. {
  33. delete m_Age;
  34. m_Age = NULL;
  35. }
  36. //深拷贝
  37. m_Age = new int(*p.m_Age);
  38. return *this;
  39. }
  40. int* m_Age;
  41. };
  42. void test01()
  43. {
  44. Person p1(18);
  45. Person p2(20);
  46. Person p3(30);
  47. p3 = p2 = p1; //赋值运算操作
  48. std::cout << "p1的年龄为:" << *p1.m_Age << std::endl;
  49. std::cout << "p2的年龄为:" << *p2.m_Age << std::endl;
  50. std::cout << "p3的年龄为:" << *p3.m_Age << std::endl;
  51. }
  52. int main()
  53. {
  54. test01();
  55. //int a = 10;
  56. //int b = 20;
  57. //int c = 30;
  58. //c = b = a;
  59. //std::cout << "a = " << a << std::endl;
  60. //std::cout << "b = " << b << std::endl;
  61. //std::cout << "c = " << c << std::endl;
  62. system("pause");
  63. return 0;
  64. }
  65. #endif