构造函数
定义
它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
另外,一个类可以有多个构造函数 ,我们可以根据其参数个数的不同或参数类型的不同来区分它们(这就是构造函数的重载)
特点
1.构造函数的命名必须和类名完全相同;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。
(这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的)
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,此默认构造函数是不带参数的;
(而一般的方法不存在这一特点)
5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放;
定义格式
class <类名>
{
public:
<类名>(参数表);
//...(还可以声明其它成员函数)
};
<类名>::<函数名>(参数表)
{
//函数体
}
实例代码
下面通过一个实例代码来说明构造函数的使用方法:
#include
using namespace std;
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 构造函数
private:
double length; //私有变量
};
/*
成员函数定义,包括构造函数
*/
Line::Line(void)
{
cout << "Object is being created" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
/*
程序的主函数
*/
int main( )
{
Line line;
line.setLength(6.0); // 设置长度
cout << "Length of line : " << line.getLength() <
return 0;
}
析构函数
定义
析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作,比如释放分配的空间,关闭文件等;
【注】析构函数的作用并不是删除对象,在对象撤销它所占用的内存之前,做一些清理的工作。外汇赠金活动,清理之后,这部分内存就可以被系统回收再利用了;
特点
1.析构函数名与类名相同,只是再函数名前面加一个位取反符号~;
2.析构函数不能带任何参数,也没有返回值(包括void);
3.只能有一个析构函数,它是不能被重载的;
4.每个类有应该有一个析构函数,如果没有显式定义,那么系统会自动生成一个默认的析构函数(默认的析构函数什么也不做);
5.析构函数不能被显式调用,只能由系统自动调用;
定义格式
class <类名>
{
public:
~<类名>();
};
<类名>::~<类名>()
{
//函数体
}
实例代码
下面通过一个实例代码来说明析构函数的使用方法:
#include
using namespace std;
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 构造函数声明
~Line(); // 析构函数声明
private:
double length;
};
/*
成员函数定义,包括构造函数,析构函数
*/
Line::Line(void)
{
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
cout << "Object is being deleted" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
/*
程序的主函数
*/
int main( )
{
Line line;
line.setLength(6.0); // 设置长度
cout << "Length of line : " << line.getLength() <
return 0;
}