深拷贝与浅拷贝

  1. /*
  2. 浅拷贝:简单的赋值操作
  3. 深拷贝:在堆区重新申请空间,进行拷贝操作
  4. */
  5. #include<iostream>
  6. using namespace std;
  7. class Person
  8. {
  9. public:
  10. Person() {
  11. cout << "无参构造函数" << endl;
  12. }
  13. Person(int age, int height) {
  14. cout << "有参构造函数" << endl;
  15. m_age = age;
  16. m_height = new int(height);
  17. }
  18. Person(const Person&p) {
  19. cout << "拷贝构造函数!" << endl;
  20. //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
  21. m_age = p.m_age;
  22. m_height = new int(*p.m_height); //深拷贝操作
  23. }
  24. ~Person() {
  25. cout << "析构函数" << endl;
  26. if (m_height != NULL)
  27. {
  28. delete m_height;
  29. }
  30. }
  31. public:
  32. int m_age;
  33. int * m_height;
  34. };
  35. void test01()
  36. {
  37. Person p1(18, 180);
  38. Person p2(p1);
  39. cout << "p1的年龄:" << p1.m_age << "身高:" << *p1.m_height << endl;
  40. cout << "p2的年龄:" << p2.m_age << "身高:" << *p2.m_height << endl;
  41. }
  42. int main() {
  43. test01();
  44. system("pause");
  45. return 0;
  46. }
  • 栈执行顺序——>先进后出
  • 利用默认拷贝构造函数时,做浅拷贝操作
  • p2执行析构后,释放堆区数据
  • p1再次执行析构时,重复释放内存

image.png
image.png

加号运算符重载

赋值image.png

赋值运算符重载

添加析构函数后,堆区内存重复释放
image.png

函数提高

  • 函数默认参数
  • 函数占位参数
  • 函数重载

    面向对象

    三大特性

  • 封装

    • 意义:将属性和行为加以权限控制
  • 继承
  • 多态

    对象初始化和清理

  • 构造函数