构造函数

时间:2024-04-25 10:48:06

构造函数的概念

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

构造函数的作用

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

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

自定义构造函数

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

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

一为函数名与类名相同,二为函数没有返回值,三在类中,三者俱全,是为构造函数。构造函数对成员变量进行初始化。
什么?没有传参怎么访问成员变量?在类中成员变量就相当于类中的全局变量,在类中函数访问成员变量不需要传参;

默认构造函数

自定义构造函数是我们自己定义的,但有时候我们甚至连构造函数都忘了写,这时不用着急,在C++中编译器会自动在类中产生一个构造函数,称为默认构造函数;
默认构造函数会自动产生并调用,操作对象是所有的成员变量,但是默认构造函数初始化的值与编译器有关,不同的编译器会有不同的随机值;所有成员变量初始化的是同一个随机值;
这时VS2022调用默认构造函数初始化的值:f4a71f0a2f8c43369396419ac1d39944.png
VS自动初始化为了0,但是在其他别人的编译器上可能是其他的数;

调用自定义构造函数

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

#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()这样。
需要注意的是,如果自己写了构造函数,编译器就不会自动生成了,像这样:

#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时进行手动初始化,否则会报错。