构造函数的定义

  • 构造函数是类的成员函数,其名称与类相同。
  • 构造函数是类的一种特殊类型的成员函数,它初始化类的对象。在 C++ 中,创建对象(类的实例)时会自动调用构造函数
  • 在创建对象时调用构造函数。它构造值,即为对象提供数据,这就是它被称为构造函数的原因。
  • 构造函数没有返回值,因此它们没有返回类型
  • 构造函数可以重载。
  • 构造函数不能被声明为虚拟的。

默认的构造函数

如果没有显式定义任何构造函数时,则编译器会隐式的生成

  • 默认构造函数(Default Constructor)
  • 拷贝构造函数(Copy Constructor)
  • 移动构造函数(Move Constructor)
class Foo {
public:
    Foo() { std::cout << "Default constructor called" << std::endl; }
    Foo(const Foo& other) { std::cout << "Copy constructor called" << std::endl; }
    Foo(Foo&& other) { std::cout << "Move constructor called" << std::endl; }
};

默认构造函数

默认构造函数是不带任何参数所有参数都提供默认值的构造函数。

拷贝构造函数

复制构造函数使用类的一个现有对象来初始化一个新的对象,使其成为现有对象的副本。

以下情况调用复制构造函数:

  • 当类的对象按值返回时。
  • 当类的对象通过值作为参数传递(给函数)时。
  • 当用一个对象去初始化同类的另一个对象时。
  • 当编译器生成一个临时对象时。

如果类具有运行时资源分配,则需要自定义拷贝构造函数。

移动构造函数

移动构造函数用于实现对象资源的移动而不是复制。

移动构造函数如何移动:

  1. 对于普通类型,直接使用现有对象对应的值进行赋值;
  2. 对于指针类型,直接将堆内存地址给新对象的指针,现有对象指针置为nullptr,避免多次delete。
  3. 对于类类型,则调用该类的移动构造函数。

由于移动操作“ 窃取” 资源, 所以它通常不分配任何资源。 因此, 移动操作通常不会抛出任何异常

类的实例化

类成员变量的初始化顺序与它们在类声明中出现的顺序相同。构造函数初始化的方式为:

  • 赋值运算符初始化了类成员数据
  • Initializer List 用于初始化类的数据成员。要初始化的成员列表用构造函数表示为逗号分隔的列表,后跟冒号