在C++的类中,存在着构造函数和析构函数两个较为特殊的函数。其中,构造函数是在对象创建后立刻自动调用,析构则是在对象被释放时自动调用的函数。
具体格式如下:
#include <iostream>
class Line{
private:
int x1;
int y1;
int x2;
int y2;
public:
Line();
void show();
~Line();
};
int main(){
{
Line line;
line.show();
}
return 0;
}
Line::Line(){
x1 = 0;
y1 = 0;
x2 = 0;
y2 = 0;
}
Line::~Line(){
std::cout << "Bye~" << std::endl;
}
void Line::show(){
std::cout << "x1 = " << x1 << std::endl;
std::cout << "y1 = " << y1 << std::endl;
std::cout << "x2 = " << x2 << std::endl;
std::cout << "y2 = " << y2 << std::endl;
}
在上面的代码中,我们并没有在一开始就给类中的四个属性赋值,但是在line对象创建以后调用其中的show函数展示属性的值的时候,显示所有的值都是0,这就是构造函数起到了作用,之所以在main中再加上{}是为了控制line对象的释放时间,通过这样的方法可以让line在括号内部存在,在括号外面就会被释放。如此一来,在line释放的时候line就会自动调用其析构函数。然后就会在控制台上出现“Bye~”的字样。
在类中声明的时候只需要将函数的类型名字和参数写好,在定义的时候再将函数的具体功能进行实现。对类中的函数同样使用,不过在使用的时候需要加上类名来限定函数的范围。
通过这种方法,我们就可以较为方便的控制指针,指针在使用的时候需要手动申请手动释放,一旦忘记手动释放就会造成内存泄漏。
若是在类的构造函数中使用手动申请,在类的析构函数中释放内存,这样就可以有效的防止内存泄漏的问题。
如下:
#include <iostream>
class Data{
private:
int* data;
public:
Data(){
data = new int;
*data = 0;
}
~Data(){
delete data;
std::cout << "delete true" << std::endl;
}
void show(){
std::cout << "data = " << *data << std::endl;
}
};
int main(){
{
Data data;
data.show();
}
return 0;
}