析构函数的作用:
对象销毁前,做清理工作。
具体的清理工作,一般和构造函数对应
比如:如果在构造函数中,使用new分配了内存,就需在析构函数中用delete释放(防止内存泄漏)。
析构函数的使用方法:
不能主动调用。
对象销毁时,自动调用。
如果不定义,编译器会自动生成一个析构函数(什么也不做)
内容泄漏概念:
内存泄漏是指在程序运行过程中,由于某些原因导致不再需要的对象仍然占用内存空间,并且这部分内存无法被操作系统回收,从而导致程序占用的内存逐渐增加,最终可能导致程序运行缓慢甚至崩溃。
Human.h
#include <iostream>
#include <string>
#include <Windows.h>
#define ADDR_LEN 64
using namespace std;
class Human{
public:
Human();
Human(string, int, int);
void eat();
void sleep();
void paly();
void work();
string getName(); // 获取名字
int getAge(); // 获取年龄
int getSalary(); // 获取薪水
void desprition(); // 描述
void setAddr(char *); // 设置地址
char *getAddr(); // 获取地址
~Human(); // 析构函数
private:
string name;
int age;
int salary;
char *addr;
};
Human.cpp
#include "Human.h"
Human::Human()
{
cout << "调用默认构造函数" << this << endl;
}
Human::Human(string name, int age, int salary)
{
cout << "调用自定义的构造函数" << this << endl;
this->name = name;
this->age = age;
this->salary = salary;
addr = new char[ADDR_LEN];
strcpy_s(addr, ADDR_LEN, "China");
}
void Human::eat()
{
cout << "我正在吃" << endl;
}
void Human::sleep()
{
cout << "我正在睡觉" << endl;
}
void Human::paly()
{
cout << "我正在玩" << endl;
}
void Human::work()
{
cout << "我正在工作" << endl;
}
string Human::getName()
{
return name;
}
int Human::getAge()
{
return age;
}
int Human::getSalary()
{
return salary;
}
void Human::setAddr(char *address)
{
strcpy_s(addr, ADDR_LEN, address);
}
char *Human::getAddr()
{
return addr;
}
void Human::desprition()
{
cout<< "name:" << name <<
" age:" << age <<
" salary:" << salary <<
" addr:" << addr << endl;
}
Human::~Human()
{
cout << "调用析构函数" << this << endl;
delete addr; // 防止内存泄漏
}
main.cpp
#include "Human.h"
void test()
{
Human h1("张三", 26, 20000);
{
Human h2("李四", 30, 25000);
}
cout << "test finish" << endl;
}
int main(void)
{
test();
system("pause");
return 0;
}
运行结果