C++入门(二) : 构造函数与析构函数【详解】

本文详细介绍了C++中构造函数的默认构造、拷贝构造和等号运算符重载,以及析构函数的作用和调用顺序。重点讲解了如何处理深拷贝和浅拷贝的问题,以及为何在子类继承时需要注意初始化列表。

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

一、构造函数

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

构造函数调用顺序为:基类的静态变量->派生类的静态变量->基类的成员变量->基类构造函数->派生类的成员变量->派生类构造函数

1、默认构造函数 

默认构造函数是无参构造函数,在没有显示创建任意构造函数的时候,编译器会默认为我们创建一个默认构造函数,但它是一个空函数,即什么都不做。

但若在类中声明了任何其他构造函数,编译器将不会再为我们创建默认构造函数,此时如果还想继续保留默认构造函数,则可以在类声明中加入以下代码:

Test() = default;

2、 默认拷贝构造函数

如果没有自定义拷贝构造函数,编译器会默认为我们创建一个默认拷贝构造函数,其内部实现仅仅是对象参数的浅拷贝。

当我们将一个已构造的类对象直接初始化构造另一个类对象时,会自动调用该类的默认拷贝函数。有三点需要注意:

  1. 默认拷贝构造函数的传入参数类型是常引用。
  2. 在使用赋值语句时,必须保证左边对象是未创建的,否则将不是调用拷贝构造函数,而是等号运算符重载函数。
  3. 在使用默认拷贝构造函数时,若源对象内,存在指针,则不能再使用系统为我们提供的默认拷贝构造函数,因为默认拷贝构造函数是浅拷贝,这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时需要我们使用深拷贝的方式去重新定义它。

3、等号运算符重载函数

如果没有自定义等号运算符重载函数,编译器会默认为我们创建一个默认等号运算符重载函数,其内部实现仅仅是对象参数的浅拷贝。

当我们将一个已构造的类对象使用另一个对象进行等号赋值时,会自动调用该类的等号运算符重载函数。有三点需要注意:

  1. 等号运算符重载函数的传入参数类型是常引用。
  2. 在使用赋值语句时,必须保证左边对象是已创建的,否则将不是调用等号运算符重载函数,而是拷贝构造函数。
  3. 在使用等号运算符重载函数时,若源对象内,存在指针,则不能再使用系统为我们提供的默认等号运算符重载函数,因为默认等号运算符重载函数是浅拷贝,这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时需要我们使用深拷贝的方式去重新定义它。

注意:若子类继承于父类,且父类无默认构造函数,则在定义子类的初始化列表时候时,必须显式的调用父类,否则将编译报错。

二、析构函数

析构函数是一个成员函数,该函数在对象超出范围或显示调用 delete函数时自动调用。 如果未定义析构函数,则编译器将提供一个默认析构函数 。

析构顺序与构造顺序刚好相反:自身的析构函数->成员变量的析构函数->父类的析构函数。

可以将析构函数声明为virtual,这样当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。

请注意,析构函数也可以声明为抽象类的纯虚函数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chiang木

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

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

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

打赏作者

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

抵扣说明:

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

余额充值