hello world!
分类: C/C++
2011-08-22 08:39:13
构造及析构函数
1、对象初始化
类的数据成员是不能在声明类时初始化的。
2、构造函数的作用
为了解决对象初始化的问题,C++提供了构造函数(constructor)来处理对象的初始化,在建立对象时自动执行。构造函数的名字必须与类名同名。
#include
using namespace std;
class Time
{public:
Time( ) //定义构造成员函数,函数名与类名相同
{
hour=0; //利用构造函数对对象中的数据成员赋初值
minute=0;
sec=0;
}
void set_time( ); //函数声明
void show_time( ); //函数声明
private:
int hour; //私有数据成员
int minute;
int sec;
};
void Time::set_time( ) //定义成员函数,向数据成员赋值
{
cin>>hour;
cin>>minute;
cin>>sec;
}
void Time::show_time( ) //定义成员函数,输出数据成员的值
{
cout<
}
int main( )
{
Time t1; //建立对象t1,同时调用构造函数t1.Time( )
t1.set_time( ); //对t1的数据成员赋值
t1.show_time( ); //显示t1的数据成员的值
Time t2; //建立对象t2,同时调用构造函数t2.Time( )
t2.show_time( ); //显示t2的数据成员的值
return 0;
}
有关构造函数的使用,有以下说明:
(1) 在类对象进入其作用域时调用构造函数。
(2) 构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同之点。
(3) 构造函数不需用户调用,也不能被用户调用。
(4) 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
(5) 如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
3、带参数的构造函数
可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。构造函数首部的一般格式为
构造函数名(类型 1 形参1,类型2 形参2,…)
前面已说明: 用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参。实参是在定义对象时给出的。
#include
using namespace std;
class Box
{
public:
Box(int,int,int); //声明带参数的构造函数
int volume( ); //声明计算体积的函数
private:
int height;
int width;
int length;
};
Box::Box(int h,int w,int len) //在类外定义带参数的构造函数
{
height=h;
width=w;
length=len;
}
int Box::volume( ) //定义计算体积的函数
{
return(height*width*length);
}
int main( )
{
Box box1(12,25,30); //建立对象box1,并指定box1长、宽、高的值
cout<<"The volume of box1 is "<
Box box2(15,30,21); //建立对象box2,并指定box2长、宽、高的值
cout<<"The volume of box2 is "<
return 0;
}
4、构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同,这称为构造函数的重载。
#include
using namespace std;
class Box
{
public:
Box( ); //声明一个无参的构造函数
Box(int h,int w,int len):height(h),width(w),length(len){ }
//声明一个有参的构造函数,用参数的初始化表对数据成员初始化
int volume( );
private:
int height;
int width;
int length;
};
Box∷Box(int h,int w,int len):height(h),width(w),length(len){ }
可以看到: 在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。
说明:
(1) 应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。
(2) 程序第5行在声明构造函数时,形参名可以省略。
(3) 如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。
(4) 在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
析构函数
析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。具体地说如果出现以下几种情况,程序就会执行析构函数:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
②static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。一个类可以有多个构造函数,但只能有一个析构函数。