构造与解析

构造函数(或称构造方法)和析构函数(或称析构方法)是类中比较特殊的类方法,从名字可以看得出来,构造函数专注于在对象创建的初期的构造工作(初始化类对象),具体来讲就是对对象各个成员的初始化,而析构函数专注于对象销毁期间的解构工作(销毁对象并释放空间),具体来讲就是对对象所占据的各种资源的善后处理。
image

点击查看代码
class BMP
{
private:
    int W ; // 宽度
    int H ; // 高度
    int BPP ; // 位深
    unsigned char *pBMP ; // 指向BMP数据的指针
    string Path ;

public:
    BMP ( const string filePath ) // 构造函数 (用于初始化图像类)
    {
        Path = filePath ;
        // 读取文件
        // 解析文件头
        // 解析信息头
        W = 800 ;
        H = 480 ;
        BPP = 24 ;
        // 解析像素数据
        pBMP = new unsigned char[W*H*3] ; // 分配内存
        
        cout << "构造函数被调用" << endl ;
    }

    // 可以对构造函数进行重载
    BMP()
    {
        cout << "无参构造函数被调用" << endl ;
    }

    ~BMP() // 析构函数 (用于释放内存)
    {
        delete [] pBMP ;
        cout << "析构函数被调用" << endl ;
    }

    void show( void )
    {
        cout << "宽度: " << W << endl ;
        cout << "高度: " << H << endl ;
        cout << "位深: " << BPP << endl ;
        cout << "路径: " << Path << endl ;
    }
    

    
};

int main(int argc, char const *argv[])
{

    {
        // 构造函数会在示例或中被自动调用
        BMP bmp("学习使我快乐.bmp") ; // 创建一个BMP对象
    
        bmp.show() ; // 调用show函数
    }

    // 当类对象离开作用域后会自动调用析构函数进行释放空间

    while (1);
    

   
    return 0;
}

由于类 BMP 定义了构造函数,因此默认的无参空构造函数就被取消了,因此在定义对象的时候也必须带上自定义构造函数的参数,例如:
image

image
image
以下代码展示了 BMP 的析构函数的实现:
析构函数一般用于释放构造函数中申请的堆内存空间。
image
注意:
一般而言,析构函数的主要任务是释放类对象在运行过程中获取的系统资源,比如文件、内存等。这些资源需要在类对象释放的时候被妥善归还系统,这些工作通常由类的析构函数来承担。析构函数内部具体的实现要根据对象实际所拥有的的资源来定。
image
上述代码显然有误,由于类成员 fileName 恰好与构造函数参数同名,因此其赋值语句发生了名字冲突,无法正常赋值,此时除了修改它们的名字外,通常也可以用 this 指针来指明变量的所属,比如:
image
this 指针是所有类方法(包括构造函数和析构函数)的隐藏参数。
this 指向调用了该类方法的类对象(指向自己)。

posted @ 2025-08-30 20:34  Lè_Sage  阅读(2)  评论(0)    收藏  举报