Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305854
  • 博文数量: 63
  • 博客积分: 1482
  • 博客等级: 上尉
  • 技术积分: 1185
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-12 19:06
个人简介

hello world!

文章分类

全部博文(63)

分类: 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运算符释放该对象时,先调用该对象的析构函数。

       析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。一个类可以有多个构造函数,但只能有一个析构函数。

 

阅读(1479) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~