3-3:类与对象中篇——默认成员函数之构造函数和析构函数

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-3:类与对象中篇——默认成员函数之构造函数和析构函数相关的知识,希望对你有一定的参考价值。

一:类的默认6个成员函数

前面说过,如果一个类里面什么都没有,那么称这样的类为空类。但其实“空类不空”,任何一个类,在我们不写的情况下,都一定会有6个默认成员函数
在这里插入图片描述
默认成员函数是这样工作的:如果我们不写,编译器就帮我们写,我们要是写了就用我们写的。如果编译器和我们的都写了,同时编译器写的有问题,也得用我们的。

二:构造函数

情景导入:
如下有一个日期类:

class Date
{
public:
	void SetDate(int year,int month,int day)
	{
		_year=year;
		_month=month;
		_day=day;
	}
	void DisPlay()
	{
		std::cout<<_year<<"-"<<_month<<"-"<<_day<<std::endl;
	}
private:
	int _year;
	int _month;
	int _day;
}

int main()
{
	Date d1;
	d1.SetDate(2020,2,2);
	d1.DisPlay();

	Date d2;
	d2.SetDate(2020,2,2);
	d2.DisPlay();
	
	return 0;
}

这里,我要给d1要设置时间,那么就调用该对象的setDate()方法,相应对应d2也是这样。但是如果每次创建对象时都要调用方法去设置信息,未免显得有点麻烦,那么能否像int a=10这样,在对象创建时就初始化,也就是设置合适的信息呢?

所以构造函数可以解决这样的问题

(1)构造函数的概念

构造函数是一个特殊的函数,它的名字和类名是相同的,实例化类时,在生成相应的对象时编译器会自动调用该函数,保证每个对象都有一个合适的初始值,并且在对象的生命周期内只调用一次。

构造函数的基本特性如下

  1. 函数名与类名相同
  2. 无返回值
  3. 对象实例化时自动调用对应构造函数
  4. 构造函数可以重载

所以对于上述日期类,可以编写构造函数如下
在这里插入图片描述
既然构造函数支持重载,所以也可把编写一个无参的构造函数,需要注意通过无参构造函数创建对象时,对象后面不能跟上括号,否则会成为函数声明

在这里插入图片描述
补充:其实上述无参和有参两种写法,都能归并成一种,那就是使用全缺省
在这里插入图片描述

(2)构造函数注意事项

1:如果用户没有定义构造函数,则编译器会自动生成一个无参的默认构造函数,只不过它传入参数仍然会是随机值,一旦用户显示定义编译器将不再生成
在这里插入图片描述
2:无参的构造函数和全缺省的构造函数都被称为默认构造函数,并且默认构造函数只能有一个

3:关于第1点,如果我们不识闲构造函数,编译器会生成默认的构造函数,但是这个默认的构造函数传入的也是随机值,感觉看起来这个默认的构造函数没有任何作用。其实C++把类型分为内置(基本)类型和自定义类型,内置类型就如int,char,自定义类型就是使用class,struct,union定义的类型,编译器默认生成的构造函数会对自定义类型成员_t调用它的默认成员函数

在这里插入图片描述

三:析构函数

(1)析构函数的概念

构造函数是用来创造对象的,那么析构函数与构造函数相反,是用来销毁对象的。
析构函数,与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,以此完成类的一些资源的清理工作

析构函数的基本特征如下

  1. 析构函数名是在类名前加上字符~
  2. 无返回值
  3. 一个类有且只有一个析构函数,如果没有显示定义,系统会自动生成默认的析构函数
  4. 对象声明周期结束时,编译器会会自动调用析构函数

那么对于之前的日期类,可以写析构函数如下

class Date
{
public:
	Date(int year=2002, int month=2, int day=2)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	~Date()//注意析构函数命名
	{
		//日期类没有什么要清理的资源,所以可以不写
	}

private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d;
	return 0;


}//待到对象销毁时,析构函数自动调用

(2)析构函数注意事项

和构造函数一样,如果我们不写析构函数,那么编译器就会默认生成析构函数,那么编译器默认生成的析构函数会和构造函数默认生成的构造函数一样,完成某些事情呢,我们知道,默认生成构造函数会对自定义类型进行操作,对于析构来说其实一样的。
在这里插入图片描述

以上是关于3-3:类与对象中篇——默认成员函数之构造函数和析构函数的主要内容,如果未能解决你的问题,请参考以下文章

类与对象(中篇)

C++从入门到入土第四篇:类与对象(中篇)

3-5:类与对象中篇——默认成员函数之运算符重载

[ C++ ] C++类与对象之 类中6个默认成员函数

C++类和对象(中篇)

C++学习摘要之二:构造函数和析构函数