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

默认析构函数

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

相关推荐
zhouwy11325 分钟前
Linux文件系统与IO编程
linux·c++
咸鱼2.01 小时前
【java入门到放弃】Dubbo
java·开发语言·dubbo
JAVA面经实录9178 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
周杰伦fans9 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
叼烟扛炮9 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
Bat U10 小时前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰11 小时前
C++ 排列组合完整指南
开发语言·c++·算法