当前位置: 首页 > news >正文

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

   首先我们要了解,在C ++的类中,什么都不写时,编译器会生成6个默认成员函数

默认成员函数:就是用户不用显示实现,编译器会自动生成的成员函数(半自动化)

1.构造函数

1.1定义

构造函数:一种特殊成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。

//引入:为什么需要提出构造函数这个概念
class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	d1.Init(2004, 10, 24);
	d1.print();

	return 0;
}
//如上述代码所示,对于Date类,可以单独设置一个成员函数,等每次穿件对象时都调用该方法进行设置信息,但是有些麻烦,所以我们希望在对象进行创建的时候,直接九江信息设置进去,所以引出了构造函数

1.2特性

注意:构造函数并没有开空间创建对象,只是初始化对象

  • 函数名与类名相同
  • 无返回值,不需要写void
  • 对象实例化时编译器自动调用对应的构造函数。(这是与init函数的最大区别)
  • 构造函数可以重载
//下面举例说明构造函数可以重载
class Date
{
public:
	Date()
	{}//1.无参构造函数
	Date(int year, int month, int day)
	{//2.带参构造函数
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;//调用无参函数
	Date d2(2004, 10, 24);//调用有参构造
	//Date();注意不要这样写,因为这样就变成了声明而非调用
	return 0;
}
  • 如果类中没有显示定义构造函数,则C++编译器会自动生成一个默认构造函数,但是一旦用户显示定义编译器将不再生成(如图所示,没有显示初始化他也会自动调用默认构造函数生成随机值)

1.3用途

C++类型=内置类型(int,char,floar....)+自定义类型(class,struct,union.....)

编译器生成的默认成员函数会对自定义类型成员调用他的默认成员函数(好好理解一下这句话)

注意:c++对于内置类型成员不初始化的缺陷,进行了修正:即内置成员变量在类中声明时可以给初始值

1.4小结

1.默认构造函数包括:无参构造函数,全缺省的构造函数,编译器默认生成的构造函数,但是默认构造函数只能有一个。

2.一般情况下,构造函数都需要我们显式的去实现

3.只有少数情况下可以让编译器自动生成构造函数

2.析构函数

2.1定义

对象在销毁的时候会自动调用析构函数,完成对象中的资源清理工作。

注意:析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。

2.2特性

  • 析构函数名是在类名前加上字符~
  • 无参数返回值类型
  • 一个类只能有一个析构函数。同理构造函数,若未显示定义,编译器会生成默认析构函数
  • 析构函数不能重载
  • 对象生命周期结束时,C++编译系统会自动调用析构函数
class Stack
{
public:
	~Stack()//析构函数
	{
		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	int* _array;
	int _capacity;
	int _size;

};
  • 编译器默认生成的析构函数,会对自定义类型成员调用它的析构函数
  • 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如Date
  • 有资源申请时,一定要写,否则会造成资源泄露,比如Stack类

相关文章:

  • electron-builder创建桌面应用
  • Visual Studio2022 中的隐形用法
  • 使用命令行工具控制wireshark对抓包文件进行针对性处理的总结
  • 代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字
  • 嵌入式硬件工程师从小白到入门-原理图(三)
  • lecode2680. 最大或值-medium
  • <el-autocompoete>下拉列表,点击选择之后的操作事件
  • 【人工智能】LM Studio 的 GPU 加速:释放大模型推理潜能的极致优化
  • 源码分析之Leaflet中dom模块DomEvent.DoubleTap的实现原理
  • STM32标准库之I2C示例代码
  • mac系统conda的python环境下安装uWSGI报缺少libpython3.9.a问题解决方法
  • Linux:gsd-account进程异常内存泄漏排查
  • 一个免费 好用的pdf在线处理工具
  • Jmeter旧版本如何下载
  • 接口自动化测试框架详解
  • 永磁同步电机模型第三篇之两相电机坐标变换
  • SolidWorks使用显卡教程
  • struts1+struts2项目兼容升级到了spring boot 2.7
  • Blender标注工具
  • 【Python】超详细实例讲解python多线程(threading模块)
  • 《歌手2025》公布首发阵容,第一期就要淘汰一人
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 体坛联播|C罗儿子完成国家队首秀,德约结束与穆雷合作
  • 极限拉扯上任巴西,安切洛蒂开启夏窗主帅大挪移?
  • 《新时代的中国国家安全》白皮书(全文)
  • 中美日内瓦经贸会谈联合声明