• C++构造函数和析构函数


    目录

    构造函数

    简介

    分类

    按参数分为:有参构造和无参构造

    按类型分为:普通构造和拷贝构造

    初始化列表

    析构函数

    简介

    虚析构函数


    构造函数

    简介

    主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。

    默认情况下,c++编译器至少给一个类添加3个函数

    1.默认构造函数(无参,函数体为空)

    2.默认析构函数(无参,函数体为空)

    3.默认拷贝构造函数,对属性进行值拷贝

    构造函数的执行顺序:基类->内嵌对象成员->派生类 析构顺序相反

    分类

    两种分类方式

    按参数分为:有参构造和无参构造

    如果用户定义有参构造函数,C++不在提供默认的无参构造函数,但是会提供默认拷贝构造函数

    1. class Person {
    2. public:
    3. //无参构造函数
    4. Person() {
    5. cout << "无参构造函数" << endl;
    6. }
    7. Person(int a) {
    8. age = a;
    9. cout << "有参构造函数" << endl;
    10. }
    11. private:
    12. int age;
    13. };

    按类型分为:普通构造和拷贝构造

    如果用户定义拷贝构造函数,C++不会再提供其他构造函数

    深拷贝浅拷贝

    浅拷贝:简单的赋值拷贝操作

    深拷贝:在堆区重新申请空间,进行拷贝操作(如果对于一些不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题)

    1. #include
    2. using namespace std;
    3. class Person {
    4. public:
    5. //无参构造函数
    6. Person() {
    7. cout << "无参构造函数" << endl;
    8. }
    9. Person(int a,int h) {
    10. age = a;
    11. height = new int(h);
    12. cout << "有参构造函数" << endl;
    13. }
    14. Person(const Person& p) {
    15. age = p.age;
    16. if (p.height != nullptr) {
    17. height = new int(*p.height);
    18. }
    19. }
    20. ~Person() {
    21. cout << "析构函数" << endl;
    22. if (height != nullptr) {
    23. delete height;
    24. height = nullptr;
    25. }
    26. }
    27. private:
    28. int age;
    29. int* height;
    30. };
    31. int main()
    32. {
    33. Person p1(10,20);
    34. Person p2 = p1;
    35. return 0;
    36. }

    初始化列表

    C++提供了初始化列表语法,用来初始化属性

    初始化顺序于类中声明顺序有关,与初始化列表无关

    1. class A {
    2. public:
    3. int m_a;
    4. int m_b;
    5. A(int a, int b) :m_b(b), m_a(a) {
    6. //先初始化m_a在初始化m_b和初始化列表顺序无关与类中声明顺序有关
    7. }
    8. };

    验证案例

    1. #include
    2. using namespace std;
    3. class A {
    4. public:
    5. int m_a;
    6. int m_b;
    7. A(int a, int b) :m_b(b), m_a(m_b) {
    8. //先初始化m_a在初始化m_b和初始化列表顺序无关与类中声明顺序有关
    9. }
    10. };
    11. int main()
    12. {
    13. A a(10, 20);
    14. cout << a.m_a << endl;
    15. return 0;
    16. }

    析构函数

    简介

    主要作用在于对象销毁前系统自动调用,执行一些清理工作

    语法:~类名(){}

    虚析构函数

    作用:用于解决父类指针释放子类对象导致清理不干净造成内存泄漏的问题

    由于多态使用时,如果子类中由属性开辟到了堆区,那么父类指针在释放时无法调用到子类的析构代码

    解决方式:将父类中的析构函数改为虚析构或纯虚析构

    virtual ~类名(){}

    virtual ~类名(){}=0;

    案例:

    1. #include
    2. using namespace std;
    3. class Animal {
    4. public :
    5. virtual ~Animal() {
    6. cout << "Animal虚构函数" << endl;
    7. }
    8. };
    9. class Cat :public Animal {
    10. string* m_name;
    11. public:
    12. Cat(string name) {
    13. cout << "Cat构造函数" << endl;
    14. m_name = new string(name);
    15. }
    16. ~Cat() {
    17. cout<<"Cat析构函数调用"<
    18. if (m_name != nullptr) {
    19. delete m_name;
    20. m_name = nullptr;
    21. }
    22. }
    23. };
    24. int main()
    25. {
    26. Animal* a = new Cat("小猫");
    27. delete a;
    28. return 0;
    29. }

  • 相关阅读:
    智慧运维:基于 BIM 技术的可视化管理系统
    全连接神经网络百度百科,全连接神经网络的作用
    基于CCE Kubernetes网络与持久化存储实战
    Python实现FPGA板卡仿真验证方法
    Selenium的安装
    软件评测师之操作系统基础知识
    【COMP329 LEC 2 Agent and Robot Architectures】
    普及篇|云备份和云容灾,你用对了吗?
    leetcode 经典题目42.接雨水
    Multichain跨链无法到账,DApp真去中心化or伪去中心化?
  • 原文地址:https://blog.csdn.net/l_ethan/article/details/126058691