这篇文章上次修改于 225 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
参考博客
在 CPP 中,类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
Motivation

Concept

Method
- 函数重载:C++ 允许构造函数重载,即一个类可以有多个构造函数,每个构造函数的参数列表不同。这允许对象以不同的方式被初始化。
 - 成员初始化列表:在构造函数中,可以使用成员初始化列表来初始化类的成员变量。这种方式比在构造函数体内赋值更高效,因为它直接在对象创建时初始化成员变量。
 - 默认构造函数:如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数,它不执行任何操作。如果需要,用户也可以显式定义一个默认构造函数。
 - 构造函数的调用:当创建对象时,构造函数会被自动调用。如果对象是通过直接调用 
new操作符创建的,那么在分配内存后,构造函数会被调用以初始化对象。 
知识点
构造函数
class ClassName {
public:
    // 默认构造函数
    ClassName() {
        // 初始化代码
    }
    // 带参数的构造函数
    ClassName(Type1 param1, Type2 param2) {
        // 初始化代码,使用参数
    }
    // 成员初始化列表
    ClassName(Type1 param1, Type2 param2) : member1(param1), member2(param2) {
        // 其他初始化代码
    }
};
特点
- 与类同名,没有返回类型。
 - 可以重载(Overload),以支持不同的初始化方式。
 - 默认情况下,编译器会生成默认构造函数,如果用户没有定义任何构造函数。
 
析构函数
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行,用于清理对象在销毁前需要释放的资源。
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
class ClassName {
public:
    // 析构函数
    ~ClassName() {
        // 清理代码
    }
};
特点
- 与类同名,前面加波浪号(~),没有参数,没有返回类型。
 
析构函数不能有参数,因为如果析构函数可以有参数,那么在对象销毁时,就必须提供这些参数,这在逻辑上是不合理的,因为对象正在被销毁,无法再提供额外的信息。
- 不能重载。
 - 默认情况下,编译器会生成默认析构函数,如果用户没有定义任何析构函数。
 
成员初始化列表
成员初始化列表是一种在构造函数体内初始化类成员变量的方式。
Line::Line( double len): length(len)
{
    cout << "Object is being created, length = " << len << endl;
}
Line::Line( double len)
{
    length = len;
    cout << "Object is being created, length = " << len << endl;
}
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
  ....
}
特点
- 更高效的初始化方式,特别是在初始化常量成员或引用成员时。
 - 直接在构造函数调用前初始化成员变量。
 
示例
#include <iostream>
#include <string>
using namespace std;
class MyComputer
{
public:
    ~MyComputer();_                                  // 这是析构函数声明_
    MyComputer(string cpu, string gpu, int memory);_ // 这是构造函数声明_
    string get_cpu();_                               // 获取CPU信息_
    string get_gpu();_                               // 获取GPU信息_
    int get_memory();_                               // 获取内存信息_
private:
    string cpu;
    string gpu;
    int memory;
};
_// 成员函数定义,包括构造函数_
MyComputer::MyComputer(string cpu, string gpu, int memory) : cpu(cpu), gpu(gpu), memory(memory)
{
    cout << "Computer is being created" << endl;
    cout << "CPU: " << cpu << endl;
    cout << "GPU: " << gpu << endl;
    cout << "Memory: " << memory << "GB" << endl;
}
MyComputer::~MyComputer()
{
    cout << "Computer is being destroyed" << endl;
}
string MyComputer::get_cpu()
{
    return cpu;
}
string MyComputer::get_gpu()
{
    return gpu;
}
int MyComputer::get_memory()
{
    return memory;
}
int main()
{
    MyComputer computer("Intel 13600kf", "NVIDIA RTX 4060Ti", 16);
    cout << "CPU: " << computer.get_cpu() << endl;
    cout << "GPU: " << computer.get_gpu() << endl;
    cout << "Memory: " << computer.get_memory() << "GB" << endl;
    return 0;
}
定义一个类
MyComputer:- 用于模拟计算机的属性,包括 CPU、GPU 和内存。
 - 包含构造函数和析构函数,分别在对象创建和销毁时执行。
 
构造函数:
- 初始化计算机的属性(CPU、GPU 和内存)。
 - 输出创建计算机时的属性信息。
 
析构函数:
- 在对象销毁时输出提示信息,表示计算机被销毁。
 
成员函数:
- 提供 
get_cpu()、get_gpu()和get_memory()函数,用于获取计算机的属性值。 
- 提供 
 主函数
main():- 创建一个 
MyComputer对象,传入 CPU、GPU 和内存参数。 - 调用成员函数获取并输出计算机的属性。
 - 程序结束时,对象自动销毁,触发析构函数。
 
- 创建一个 
 
思考
说白了,构造函数就是对象在创建时执行的函数,析构函数就是在对应删除时执行的函数
对于使用 new 和 delete 关键字构建的动态对应,在执行对应的代码的时候会自动调用对应的构造和析构函数