C++中构造函数和析构函数

【注】致力于将知识讲明白!不懂请留言!

构造函数

定义
它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与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;
}

上述代码的结果是:
在这里插入图片描述

析构函数使用原则
其实,我们在许多类不需要显式编写析构函数。析构函数通常用于释放在构造函数或在生命期内获得的资源(如动态分配的内存)。广义上讲,析构函数的作用并不仅仅限于释放资源方面,它可以执行任意操作,用来执行“对象即将被撤销之前程序员所期待的任何操作。
如果类需要析构函数,则该类几乎必然需要定义自己的复制构造函数和赋值运算符重载,这个规则称为析构函数三法则。原因是如果类真的需要析构函数,则类中必然出现了指针类型成员且分配了资源(否则使用合成析构函数就可以了);

发布了33 篇原创文章 · 获赞 38 · 访问量 8447

猜你喜欢

转载自blog.csdn.net/weixin_44480968/article/details/104713004