构造与解析
构造函数(或称构造方法)和析构函数(或称析构方法)是类中比较特殊的类方法,从名字可以看得出来,构造函数专注于在对象创建的初期的构造工作(初始化类对象),具体来讲就是对对象各个成员的初始化,而析构函数专注于对象销毁期间的解构工作(销毁对象并释放空间),具体来讲就是对对象所占据的各种资源的善后处理。
点击查看代码
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 定义了构造函数,因此默认的无参空构造函数就被取消了,因此在定义对象的时候也必须带上自定义构造函数的参数,例如:
以下代码展示了 BMP 的析构函数的实现:
析构函数一般用于释放构造函数中申请的堆内存空间。
注意:
一般而言,析构函数的主要任务是释放类对象在运行过程中获取的系统资源,比如文件、内存等。这些资源需要在类对象释放的时候被妥善归还系统,这些工作通常由类的析构函数来承担。析构函数内部具体的实现要根据对象实际所拥有的的资源来定。
上述代码显然有误,由于类成员 fileName 恰好与构造函数参数同名,因此其赋值语句发生了名字冲突,无法正常赋值,此时除了修改它们的名字外,通常也可以用 this 指针来指明变量的所属,比如:
this 指针是所有类方法(包括构造函数和析构函数)的隐藏参数。
this 指向调用了该类方法的类对象(指向自己)。