一、类的构造和析构的基本概念
1.1 构造函数和析构函数的概念
构造函数的定义:
- C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数。
- 构造函数在定义的时候可以有参数
- 没有任何返回类型的声明
构造函数的调用:
- 自动调用:一般情况下C++编译器会自动调用构造函数
- 手动调用:在一些情况下则需要手工调用构造函数
析构函数的定义:
- C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数 语法:~ClassName()
- 析构函数没有任何参数也没有任何返回类型的声明
- 析构函数在对象销毁的时候自动调用
析构函数的机制:
- C++编译器自动调用
二、例子说明
2.1 例一
class Test
{
public:
Test()//无参数,析构函数
{
cout << "我是析构函数,被执行了" << endl;
}
~Test()//析构函数
{
cout << "我是析构函数,被调用了" << endl;
}
};
void main()
{
Test t1, t2;
system("pause");
}
结果:(因为使用了systempause所以类执行到这个地方的时候就停住了,所以我们可以通过搭建一个舞台来展示构造和析构函数的过程)
2.2 例二(改进)
class Test
{
public:
Test()//无参数,析构函数
{
cout << "我是析构函数,被执行了" << endl;
}
~Test()//析构函数
{
cout << "我是析构函数,被调用了" << endl;
}
};
//给对象搭建一个舞台,研究对象完整的生命周期
void objectplay()
{
Test t1; //这是一个局部变量,当函数运行完毕后
//内存将会被回收,此时执行了析构函数
Test t2;//要是定义两个对象,两个对象都会调用析构和构造函数
//析构的时候县创建的对象后释放,构造的时候县创建的先构造
}
void main()
{
objectplay();
system("pause");
}
结果(可以单步调试看析构函数与构造函数执行顺序)
特别注意:定义多个对象时,析构的时候先创建的对象后释放,构造的时候先创建的先构造
2.3 如何使用构造函数和析构函数的例子
class Test
{
public:
Test()//无参数,析构函数
{//完成对属性的初始化工作
a = 10;
p = (char *)malloc(100);
strcpy_s(p, strlen("aaaabbbb")+1, "aaaabbbb");//注意是strlen(temp)+1
cout << "我是析构函数,被执行了" << endl;
}
void print()
{
cout << p << endl;
cout << a << endl;
}
~Test()//析构函数
{//这样就不会有内存泄漏
if (p != NULL)
{
free(p);
}
cout << "我是析构函数,被调用了" << endl;
}
private:
int a;
char *p;
};
//给对象搭建一个舞台,研究对象完整的生命周期
void objectplay()
{
Test t1; //这是一个局部变量,当函数运行完毕后
//内存将会被回收,此时执行了析构函数
t1.print();//使用它
Test t2;//要是定义两个对象,两个对象都会调用析构和构造函数
//析构的时候县创建的对象后释放,构造的时候县创建的先构造
t2.print();
}
int main()
{
objectplay();
system("pause");
}