- 构造函数和析构函数
我们已经知道了对象就是类的实例,二者的关系就相当于数据类型与它的变量的关系。每个对象区别于其他对象的地方就是依靠它的自身属性,即数据成员的值。C++中,对象在定义的时候进行的数据成员的设置,称为对象的初始化。同样,在特定对象使用结束时,还要对数据成员进行一些清理工作。C++中对类的初始化和清理的工作,分别由两个特殊的成员函数完成,它们就是构造函数和析构函数。
- 构造函数
构造函数的作用就是在对象创建时,利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于彼对象的特征。
构造函数的函数名与类名相同,而且它没有返回值,不能有任何返回类型,也不能使用void,构造函数通常被定义为公有函数。但是,这个构造函数只能调用一次。
可以定义构造函数使CDate类的对象在生成时就获得一个缺省的日期值,类CDate的定义修改如下:
Class CDate
{
Public:
CDate(); //声明构造函数
CDate(int y ,int m, int d); //声明重载构造函数
Private:
Int Year,Month,Day;
}
构造函数的实现过程
CDate::CDate()
{
Year =2018;
Month = 2;
Day = 10;
}
CDate::CDate(int y,int m,int d)
{
Year= y;
Month = m;
Day = d;
}
在类的定义中增加了构造函数CDate(),并定义了重载的构造函数。作为类的成员函数,构造函数可以使用所有的数据成员,构造函数可以带有参数表,也可以不带,但是绝对没有返回值,因为它是一个对象的初始化,没必要使用返回值。
创建对象时构造函数是被自动调用的,至于调用哪个构造函数,依据匹配情况自动选择。在创建一个对象时,可以使用带参数的构造函数将对象进行初始化,则对象的定义形式为
Void main()
{
CDate Date1;
CDate Date2(2008,8,24);
}
上例中,创建对象时Date1时,调用构造函数CDate(); 而创建Date2时,调用构造函数CDate(int,int ,int)
在创建对象时调用了无参数的构造函数CDate(),此时不要再对象名后加圆括号。以下定义一个对象是错误的:
CDate Date1();
这样不是定义了一个对象,而是声明了一个函数,函数名为Date1,函数的返回值为CDate类的对象。
- 析构函数
我们已经知道了构造函数是由系统自动调用为对象进行初始化工作的,但是既然是初始化,那么就一定会占用内存空间对吧,如果使用malloc分配了一段内存空间,该如何释放呢?这样就用到了析构函数。它执行一些在对象撤销前必须执行的清理任务,例如释放由构造函数申请分配的内存等。
析构函数的函数名也是和类名相同,只不过是在类名前边追加一个“~”字符作为前缀。
Class CArray
{
Public:
CArry(int size); //构造函数声明
~CArry(); //析构函数声明
Int GetAt(int nIndex);
Void SetAt(int nIndex, int newElement);
Protected:
Int *m_Data; //数组首地址
Int m_Size; //数组中包含的元素个数。
}
CArry::CArry(int size)
{
m_Data = new int[size];
m_Size = size;
}
CArry::~CArry(){
Delete[] m_Data;
}
其他函数定义:
Void main()
{
CArry a(10);
其他程序。
}
析构函数是在对象的生命周期自动调用的,不用在主函数中进行说明,但是得在函数实现的时候写好实现部分。和构造函数一样,构造函数在声明一个对象的时候也是自动调用的把。为了更好的匹配构造函数才加了一个(10),
构造函数和析构函数都是由系统自动调用的,在程序中定义一个对象,则内存为它分配一定的内存空间,然后调用它的构造函数;当对象生命周期结束时,系统调用其析构函数,然后收回对象所使用的内存空间。
所有的类中都必须包含由构造函数和析构函数,如果在类中没有进行定义,则系统会自动为类建立缺省的定义。在创建对象时都要进行初始化,因此必须定义构造函数,如果在构造函数中进行了内存资源的申请,则必须定义析构函数完成内存的释放,否则可以不定义析构函数。
- 复制构造函数
复制构造函数也是一种构造函数,也是对 对象的初始化操作。其作用就是使用一个已经存在的对象(由复制构造函数的参数指定的对象),去初始化一个正在创建的同类对象,归根结底就是使用一个已经存在的对象的值去初始化另一个对象。
其声明形式为:
Class CStr
{
Public:
类名(形参表);
类名(类名 & 对象名);
}复制构造函数的形参是本类对象的引用
同构造函数和析构函数一样,每一个类都必须有一个复制构造函数。若类中没有定义复制构造函数,则系统自动定义一个默认的复制构造函数。
定义:
Class CStr
{
Public:
CStr(char *s);
CStr(CStr &);
Private:
Char *pStr;
};
实现:
CStr::CStr(char *s){
PStr = new char[strlen(s)+1];
Strcpy(pStr,s );
}
CStr::CStr(CStr &temp)
{
PStr = new char[strlen(temp.Pstr)+1];
Strcpy(pStr, temp.pStr);
}
使用:
Void main()
{
CStr a(“hellow”);
CStr b(a);
}