【注】致力于将知识讲明白!不懂请留言!
构造函数
定义
它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
另外,一个类可以有多个构造函数 ,我们可以根据其参数个数的不同或参数类型的不同来区分它们(这就是构造函数的重载)
特点
1.构造函数的命名必须和类名完全相同;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。
(这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的)
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,此默认构造函数是不带参数的;
(而一般的方法不存在这一特点)
5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放;
定义格式
class <类名>
{
public:
<类名>(参数表);
//...(还可以声明其它成员函数)
};
<类名>::<函数名>(参数表)
{
//函数体
}
实例代码
下面通过一个实例代码来说明构造函数的使用方法:
#include <iostream>
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() <<endl;
return 0;
}
【注】这里的构造函数是无参数的,当然我们也可以把它定义成参数的;
上述代码的结果是:
析构函数
定义
析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作,比如释放分配的空间,关闭文件等;
【注】析构函数的作用并不是删除对象,在对象撤销它所占用的内存之前,做一些清理的工作。清理之后,这部分内存就可以被系统回收再利用了;
特点
1.析构函数名与类名相同,只是再函数名前面加一个位取反符号~;
2.析构函数不能带任何参数,也没有返回值(包括void);
3.只能有一个析构函数,它是不能被重载的;
4.每个类有应该有一个析构函数,如果没有显式定义,那么系统会自动生成一个默认的析构函数(默认的析构函数什么也不做);
5.析构函数不能被显式调用,只能由系统自动调用;
定义格式
class <类名>
{
public:
~<类名>();
};
<类名>::~<类名>()
{
//函数体
}
实例代码
下面通过一个实例代码来说明析构函数的使用方法:
#include <iostream>
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() <<endl;
return 0;
}
上述代码的结果是:
析构函数使用原则
其实,我们在许多类不需要显式编写析构函数。析构函数通常用于释放在构造函数或在生命期内获得的资源(如动态分配的内存)。广义上讲,析构函数的作用并不仅仅限于释放资源方面,它可以执行任意操作,用来执行“对象即将被撤销之前程序员所期待的任何操作。
如果类需要析构函数,则该类几乎必然需要定义自己的复制构造函数和赋值运算符重载,这个规则称为析构函数三法则。原因是如果类真的需要析构函数,则类中必然出现了指针类型成员且分配了资源(否则使用合成析构函数就可以了);