五种特殊函数概述

构造函数

  • 拷贝构造函数:定义当用同类型的另一个对象初始化本对象时做什么
  • 移动构造函数:定义当用同类型的另一个对象初始化本对象时做什么

运算符

  • 拷贝运算符:定义当将一个对象赋予同类型的另一个对象时做什么
  • 赋值运算符:定义当将一个对象赋予同类型的另一个对象时做什么

析构函数

定义当此类型对象销毁时做什么

注:如果没有定义这些函数,编译器会自动定义合成拷贝构造函数\合成拷贝运算符。但有时会出错。

拷贝构造函数

基本特征

  • 第一个参数是自身类类型的引用,基本是const引用,且任何额外参数都有默认值
  • 一般用于将参数成员逐个拷贝到正在创建的对象中

拷贝规则

拷贝方式由成员类型决定:

  • 类类型用拷贝构造函数
  • 内置类型直接拷贝

初始化方式

  • 直接初始化使用普通的函数匹配,选择最匹配的构造函数
  • 拷贝初始化只使用拷贝构造函数或移动构造函数

拷贝初始化使用场景

  1. 用=定义变量(拷贝赋值)
  2. 将对象作为实参传递给非引用类型的形参(非引用类型传参执行拷贝)
  3. 返回类型为非引用类型的函数返回对象(返回非引用类型也会执行拷贝)
  4. 列表初始化

注:使用拷贝初始化时只能显式转换,不接受隐式的(比如char*转化string)

拷贝赋值运算符

重载运算符

本质上是函数,函数名由operator和后接的运算符组成。

对于二元运算符:

  • 通常将右侧运算对象作为显式参数传递
  • 返回一个指向左侧运算对象的引用

拷贝赋值运算符也通常用于将右侧运算对象每个成员赋予左测对象相应成员。

析构函数

基本特征

  • 作用是释放对象使用的资源,并销毁对象的非static数据成员
  • 无返回值无参数不能重载

执行顺序

首先执行函数体,然后在析构部分按初始化顺序的逆序销毁成员,析构部分是隐式的。

调用时机

无论何时一个对象被销毁,就会自动调用其析构函数:

  1. 变量在离开其作用域时被销毁
  2. 当一个对象被销毁时,其成员被销毁
  3. 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁
  4. 对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁
  5. 对于临时对象,当创建它的完整表达式结束时被销毁