目录
创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的。
为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
基本概念
有关构造函数
1、构造函数定义及调用
1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
2)构造函数在定义时可以有参数;
3)没有任何返回类型的声明。
2、构造函数的调用
自动调用:一般情况下C++编译器会自动调用构造函数
手动调用:在一些情况下则需要手工调用构造函数
有关析构函数
1、析构函数定义及调用
1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数
语法:~ClassName()
2)析构函数没有参数也没有任何返回类型的声明
3)析构函数在对象销毁时自动被调用
2、析构函数调用机制
C++编译器自动调用
案例讲解
class Test
{
public:
Test() //无参数 构造函数
{
a = 10; //作用完成对属性的初始化工作
p = (char *)malloc(100);
strcpy(p, "aaaaffff");
cout<<"我是构造函数 被执行了"<<endl;
}
void print()
{
cout<<p<<endl;
cout<<a<<endl;
}
~Test() //析构函数
{
if (p != NULL)
{
free(p);
}
cout<<"我是析构函数,被调用了" <<endl;
}
protected:
private:
int a ;
char *p;
};
其中,"Test()"是构造函数, "~Test()"是析构函数。
如果,单纯的看,无法探知这个函数的声明周期,下面创建一个对象,通过对象来看这个函数所运行的生命周期:
//给对象搭建一个舞台,研究对象的行为
void objplay()
{
//先创建的对象 后释放
Test t1;
t1.print();
printf("分隔符\n");
Test t2;
t2.print();
}
开始运行,在定义对象的时候,会自动调用构造函数,然后,当对象的生命周期结束的时候,会自动调用析构函数进行析构。
当进行如下定义的时候:
void objplay()
{
Test t1, t2;
}
构造和析构的顺序该是如何呢?答:构造的时候,先构造t1再构造t2,析构的时候先析构t2,再析构t1(先创建的对象,后释放)。
构造与析构对函数来说有什么用呢?
构造函数的作用:完成对属性的初始化工作。
如果我们在构造函数中进行了分配内存的操作,对一些变量进行初始化,然后,在其余的函数中用初始化后的量进行运算。那么,当程序运行完毕之后,把原来分配的内存和初始化的变量给释放和清除掉,防止内存泄漏。
总体代码
dm01_类的构造和析构基础.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Test
{
public:
Test() //无参数 构造函数
{
a = 10; //作用完成对属性的初始化工作
p = (char *)malloc(100);
strcpy(p, "aaaaffff");
cout<<"我是构造函数 被执行了"<<endl;
}
void print()
{
cout<<p<<endl;
cout<<a<<endl;
}
~Test() //析构函数
{
if (p != NULL)
{
free(p);
}
cout<<"我是析构函数,被调用了" <<endl;
}
protected:
private:
int a ;
char *p;
};
//给对象搭建一个舞台,研究对象的行为
void objplay()
{
//先创建的对象 后释放
Test t1;
t1.print();
printf("分隔符\n");
Test t2;
t2.print();
}
void main11()
{
objplay();
cout<<"hello..."<<endl;
system("pause");
return ;
}