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,没有返回值,在类结束时会自动调用;通常进行释放在堆区的成员变量;

默认析构函数

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

相关推荐
旖旎夜光3 小时前
C++(17)
c++·学习
Larry_Yanan4 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼4 小时前
Java classloader
java·开发语言·python
superman超哥4 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…4 小时前
Python - 继承
开发语言·python
JIngJaneIL5 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想5 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
唐装鼠5 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Lucas555555555 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
源代码•宸5 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang