【类的默认成员函数】构造函数&&析构函数【C++】

【类的默认成员函数】构造函数&&析构函数【C++】

任何一个类在我们不写的情况下,都会自动生成6个默认成员函数

image

构造函数:初始化(不是开空间!)

日常实操中最好自己写一个!!!!!!!!

Date()
{
	_year = 1;
	_month = 1;
	_day = 1;
}

特点

(1)函数名和类名相同

(2)无返回值

(3)对象实例化时编译器自动调用对应的构造函数

自动调用,不用手动写
image

(4)构造函数可以重载

Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

【调用方式】

Date d2(2023, 10, 21);

image

推荐使用全缺省的构造函数:是否传参数可由你决定。传参数数量也是由你决定

(普通函数和全缺省函数在调用时会出现错误)

//普通的构造函数
	Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}
//全缺省的构造函数
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

(5)如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成

如果一个类中的成员全是自定义类型,我们就可以用默认生成的函数
如果有内置类型的成员,或者需要显示传参初始化,那么都要自己实现构造函数

可以不传参数就调用构造,都可以叫默认构造

C++默认生成的构造函数对于内置类型成员变量不做处理,对于自定义类型的成员变量才会处理
(1)内置类型/基本类型:int、char、double、指针……
(2)自定义类型:class、struct去定义的类型对象

class A
{
public:
	A()
	{
		cout << "A()" << endl;
		_a = 1;
	}
private:
	int _a;
};
class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		cout << endl;
	}
private:
	int _year = 2023;
	int _month = 11;
	int _day = 11;
	A _aa;
};
 
int main()
{
	Date d1;
	d1.Print();
	return 0;
}

image
发现A的初始化被处理了,Date则没有被处理

(6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数

不想自己再写构造函数也要对内置类型处理

class Date
{
public:
 
	// 我们不写,编译器会生成一个默认无参构造函数
	/*Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}*/
 
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:

	// C++11 打的补丁,针对编译器自己默认成员函数不初始化问题
	int _year = 2023;
	int _month = 10;
	int _day = 21;
	
};
int main()
{
	// 没有定义构造函数,对象也可以创建成功,因此此处调用的是编译器生成的默认构造函数
	Date d;
	d.Print();
}

image

析构函数:清理(不是销毁!)~

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类

有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类

~Date()
{
	cout << "~Date()" << endl;
}
class Date
{
public:
	Date(int year = 2023, int month = 10, int day = 21)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	d1.Print();
	return 0;
}

image

关于谁先构造谁先析构

int main()
{
	Stack st1;
	Stack st2;
}

st1和st2是在上的:先进后出
st2先析构,st1后析构

posted @ 2024-11-26 15:14  White_ink  阅读(41)  评论(0)    收藏  举报