C++:构造函数与虚构函数【详解】

在这里插入图片描述

C++作为一门面向对象的编程语言,在使用过程中,绝对会经常使用到类的构造函数及析构函数,本文主要总结了构造函数及析构函数的用法。

1、构造函数

在对某类进行实例化时,一定会调用该类的构造函数,构造函数主要完成的是类成员变量的初始化(静态变量除外,它是在全局数据区进行初始化的)或者内存分配工作。构造函数无返回值,可重载。

  1. 默认构造函数:默认构造函数是无参构造函数,任何类都有一个默认构造函数,在没有显示创建构造函数的时候,系统会默认为我们创建一个默认构造函数,但它是一个空函数,即什么都不做,但若类中存在其他构造函数时,默认构造函数将不会被自动创建。当然,我们可以显式的去定义它。
  2. 默认拷贝构造函数:当我们调用函数进行传参(非引用传参)时,或者将一个类对象直接初始化另一个类对象时,会自动调用该类的默认拷贝函数。有三点需要注意:(1)默认拷贝构造函数的传入参数是引用传递,且不是常引用,因此,可以在自定义的默认拷贝构造函数中对源对象进行修改。(2)在使用赋值语句时,必须保证左边对象是未创建的,否则将不是调用默认拷贝构造函数,而是调用运算符‘=’的重载函数。(3)在使用默认拷贝构造函数时,若源对象内,存在指针,则不能再使用系统为我们提供的默认拷贝构造函数,甚至连运算符‘=’也不能直接使用,因为默认拷贝构造函数和默认等号运算符重载函数都是浅拷贝,这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时我们需要显示去重新定义它。
  3. 若子类继承于父类,定义子类的初始化列表时候时,没有显式的调用父类,则父类的默认构造函数(无参的)会被先默认调用,之后才会调用子类的构造函数,若想要调用父类的其他带参构造函数,则需要在定义子类的初始化列表时,显示调用父类的构造函数,格式如下:SubClass::SubClass(…):BsaeClass(…)。若是多继承,则根据继承时声明父类的先后顺序调用,若多个父类都是继承于同一个类,即菱形继承,则在子类实例化时,父类的父类的构造函数将被调用多次,为了避免这种情况,我们在父类声明继承时,要采用虚继承的方式,即加上virtual,这样只会调用父类的父类构造函数一次。
  4. 若类中成员变量包含其他类,则创建该类对象时,会首先调用成员变量类的构造函数,再调用该类的构造函数。

2、析构函数
类的析构函数一般是在对象的生命周期结束时被调用, 它的主要功能是对对象的一些资源进行回收,例如释放内存等。

  1. 虚构函数在以下三种情况时,会被调用:(1)实例化对象的生命周期结束销毁时。(2)delete指向对象的指针时。(3)对象A是对象B的成员,B的析构函数被调用时,对象A的析构函数也被调用。
  2. 虚函数的调用顺序是子类先调用,父类后调用,多继承时,后继承的先调用。
  3. 如果父类的析构函数不加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。 如果父类的析构函数加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
  4. 若类中存在成员变量类时,会先调用该类的的析构函数,然后再接着调用成员变量类的析构函数。
    在这里插入图片描述
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值