C++:构造函数与析构函数

目录

构造函数

构造函数的概念

析构函数的作用

自定义构造函数与默认构造函数

自定义构造函数

默认构造函数

调用自定义构造函数

析构函

自定义析构函数和默认构造函数

自定义构造函数

默认析构函数


构造函数

构造函数的概念

我们通常的函数是都需要有返回值的,但是有这样一类函数不需要返回值,而且函数名必须与类名相同(类中的特有的函数),这就是构造函数。

构造函数的作用

由于我们使用类时,通常会忘记进行对成员变量进行初始化,这个问题时常困扰着祖师爷,所以构造函数应运而生,构造函数在类中承担着初始化成员变量的作用;

自定义构造函数与默认构造函数

自定义构造函数

我以日期类举例子,看招:

cpp 复制代码
#include<iostream>
using namespace std;
class data
{
public:
	data()//构造函数
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}
private:
	int _year;
	int _month;
	int _day;
};

一为函数名与类名相同,二为函数没有返回值,三在类中,三者俱全,是为构造函数。构造函数对成员变量进行初始化。

什么?没有传参怎么访问成员变量?在类中成员变量就相当于类中的全局变量,在类中函数访问成员变量不需要传参;

默认构造函数

自定义构造函数是我们自己定义的,但有时候我们甚至连构造函数都忘了写,这时不用着急,在C++中编译器会自动在类中产生一个构造函数,称为默认构造函数;

默认构造函数会自动产生并调用,操作对象是所有的成员变量,但是默认构造函数初始化的值与编译器有关,不同的编译器会有不同的随机值;所有成员变量初始化的是同一个随机值;

这时VS2022调用默认构造函数初始化的值:

VS自动初始化为了0,但是在其他别人的编译器上可能是其他的数;

调用自定义构造函数

构造函数在调用时是无法使用,成员访问符来调用的,与此不同,看代码:

cpp 复制代码
#include<iostream>
using namespace std;
class date
{
public:
	date(int a=1, int b=2)
	{
		_a = a;
		_b = b;
	}
	void print()
	{
		cout << _a << " " << _b << endl;
	}
private:
	int _a;
	int _b;
}s;
int main()
{
	date s1(5,66);
	s1.print();
	return 0;
}

对构造函数进行缺省处理,会自动初始化为默认值,同时我们也可以方便的给出初始化值,像date s1()这样。

需要注意的是,如果自己写了构造函数,编译器就不会自动生成了,像这样:

cpp 复制代码
#include<iostream>
using namespace std;
class date
{
public:
	date(int a, int b)
	{
		_a = a;
		_b = b;
	}
	void print()
	{
		cout << _a << " " << _b << endl;
	}
private:
	int _a;
	int _b;
}s;
int main()
{
	date s1(5,6);
	s1.print();
	return 0;
}

构造函数没有全缺省,那么我们就必须在定义s1时进行手动初始化,否则会报错。

析构函数

析构函数与构造函数的作用是相反的,析构函数是用来对部分的成员变量进行清理的;例如我们在类中有成员变量在堆区开辟了空间,我们如果忘记最后进行delete,那么就会造成内存泄漏。析构函数就解决了这个问题;

自定义析构函数和默认构造函数

自定义构造函数

下来写个构造函数叭,一看便知:

cpp 复制代码
#include<iostream>
using namespace std;
class data
{
public:
	~data()
	{
		cout << "~data()" << endl;
	}
private:
	int* a;
	int b;
	int c;
}s;

int main()
{}

析构函数与构造函数差不多,在函数名上有所区别,析构函数的名字必须是~类名,如上的~data,没有返回值,在类结束时会自动调用;通常进行释放在堆区的成员变量;

默认析构函数

与默认构造函数一家,都是因遗忘而诞生的,类中必有析构函数,你不写,编译器自己写,对部分成员进行清理。

相关推荐
shinelord明5 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2111 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu12 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202112 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客13 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh15 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha26 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc28 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_30 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400230 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome