C++——构造函数、析构函数

69 阅读3分钟

构造函数:对象的初始化

构造函数是一种特殊的成员函数,其名称与类名相同,没有返回类型(甚至没有 void)。它的主要作用是在创建类的对象时自动初始化对象的状态。

特点:

  • 与类名相同。
  • 没有返回类型。
  • 在对象创建时自动调用。
  • 可以有多个重载的构造函数(参数列表不同)。

分类:

  • 默认构造函数: 没有参数的构造函数。如果类中没有显式定义构造函数,编译器会自动生成一个默认构造函数。
  • 参数化构造函数: 带有参数的构造函数,允许在创建对象时传递初始值。
  • 拷贝构造函数: 以同类型的另一个对象作为参数的构造函数,用于创建对象的副本(将在后续课程中详细介绍)。

代码示例(包含默认构造函数和参数化构造函数):

#include <iostream>
#include <string>

class Cat {
public:
  std::string name;
  int age;

  // 默认构造函数
  Cat() : name("Unknown"), age(0) {
    std::cout << "一只未命名的小猫被创建了。" << std::endl;
  }

  // 参数化构造函数
  Cat(const std::string& catName, int catAge) : name(catName), age(catAge) {
    std::cout << "小猫 " << name << " 被创建了!" << std::endl;
  }

  void meow() const {
    std::cout << "喵!我是 " << name << ", " << age << " 岁了!" << std::endl;
  }
};

int main() {
  Cat cat1; // 调用默认构造函数
  cat1.meow();

  Cat cat2("Tom", 2); // 调用参数化构造函数
  cat2.meow();

  return 0;
}

析构函数:对象的清理

析构函数也是一种特殊的成员函数,其名称与类名相同,并在前面加上波浪号 ~。它没有参数,也没有返回类型。析构函数在对象即将被销毁时自动调用,用于执行清理工作,例如释放对象占用的资源(如动态分配的内存、打开的文件等)。

特点:

  • 名称与类名相同,前加 ~
  • 没有参数。
  • 没有返回类型。
  • 在对象生命周期结束时自动调用。
  • 一个类只能有一个析构函数。

何时调用析构函数:

  • 局部对象在离开其作用域时。
  • 动态分配的对象通过 delete 删除时。
  • 全局对象在程序结束时。

代码示例:

#include <iostream>

class ResourceHolder {
public:
  ResourceHolder() {
    resource = new int[10];
    std::cout << "资源已分配。" << std::endl;
  }

  ~ResourceHolder() {
    delete[] resource;
    std::cout << "资源已释放。" << std::endl;
  }

private:
  int* resource;
};

int main() {
  {
    ResourceHolder holder; // 在此代码块结束时,holder 的析构函数会被调用
  }

  ResourceHolder* dynamicHolder = new ResourceHolder();
  delete dynamicHolder; // 手动删除动态分配的对象,触发析构函数

  return 0;
}

构造函数参数初始化列表 4

  1. 什么是构造函数参数初始化表?
    • 构造函数参数初始化表是在构造函数的参数列表和函数体之间,使用冒号 : 分隔的代码块。
    • 用于初始化成员变量。
  2. 使用场景
    • 初始化常量成员变量。
    • 初始化引用类型的成员变量。
    • 初始化没有默认构造函数的类类型的成员变量。
  3. 语法
class MyClass {
public:
    int value1;
    int value2;

    MyClass(int val1, int val2) : value1(val1), value2(val2) {}
};
  1. 示例代码
class MyClass {
public:
    const int value1;
    int& value2;

    MyClass(int val1, int& val2) : value1(val1), value2(val2) {
      // 
    }
};

int main() {
    int x = 10;
    MyClass obj(5, x);

    return 0;
}