【C++】类的默认成员函数

类的六个默认成员函数

当一个类中什么成员都没有时被称为空类。
空类:即任何类在什么都不写时,编译器会自动生成6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。

默认成员函数
初始化和清理
构造函数主要完成初始化工作
析构函数主要完成清理工作
拷贝赋值
拷贝构造是使用同类对象初始化创建对象
赋值重载主要是把一个对象赋值给另一个对象
取地址重载
主要是普通对象和const对象取地址,这俩个很少会自己实现

构造函数

构造函数的概念

class Data
{
   
public:
	void Init(int year = 2000, int month = 1, int day = 1)
	{
   
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
   
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main(void)
{
   
	Data d1;
	d1.Init();
	d1.Print();

	Data d2;
	d2.Init(2024,6,8);
	d2.Print();
	return 0;
}

每次创建代码时,都需有初始化代码,使得工作量加大,引入构造函数可以进行初始化工作。

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象的整个生命周期内只使用一次。

构造函数的特性

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

其特征如下:
1.函数名与类名相同
2.无返回值(也不需要写void)
3.对象实例化时编译器会自动调用对应的构造函数

class Data
{
   
public:
	Data(int year = 2000, int month = 1, int day = 1)
	{
   
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main(void)
{
   
	Data d1();
	return 0;
}

4.构造函数可以重载

class Data
{
   
public:
	//带参数的构造函数
	Data(int year, int month, int day)
	{
   
		_year = year;
		_month = month;
		_day = day;
	}
	//不带参数的构造函数
	Data()
	{
   
		_year = 2000;
		_month = 1;
		_day = 1;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main(void)
{
   
	//调用带参数的构造函数
	Data d1(2024,6,8);
	//调用不带参数的构造函数
	Data d2;
	return 0;
}

构造函数支持重载的原因是:可以存在不同的初始化情况。
【注意】如果公共无参构造函数创建对象时,对象后面不用接括号,否则会变成函数声明。
在这里插入图片描述
5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户定义编译器将不再生成。

class Data
{
   
public:
	void Print()
	{
   
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main(void)
{
   
	Data d1;
	d1.Print();

	return 0;
}

编译器默认初始化成随机值:
在这里插入图片描述
这里需要说明一下:
C++里将类型分成俩类:
1.内置类型
内置类型属于基本类型,是语言本身定义的基础类型,例如int、char、double、指针等等
2.自定义类型
用struct、calss等定义的类型

编译器自动默认生成构造函数,内置类型不做处理,自定义类型会去调用其默认构造。(这里需要注意的是,不同的编译器有不同的处理方法,有些编译器也会处理,但是至少部分编译器个性化处理,不是所有的编译器都会处理)

总结:
1.一般情况下,有内置类型成员的,就需要自己写构造函数,不能让编译器自己生成
2.全部都是自定义类型成员,可以考虑让编译器自己生成。(一个经典的算法题:使用俩个栈实现队列就可以使用默认构造函数)

6.C++11中,在成员声明的时候可以给缺省值

class Data
{
   
public:
	void Print()
	{
   
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year = 2000;
	int _month = 1;
	int _day = 1;
};

【注意】这里不是初始化
由于这里只能存在成员变量的声明,没有开空间,这里给的是默认的缺省值,给编译器生成默认构造函数用。

7.无参的构造函数和全缺省的构造函数都称为默认构造函数、并且默认构造函数只能有一个。
【注意】无参构造函数、全缺省默认构造函数、如果我们自己没写,编译器默认生成的构造函数都可以认为是默认构造函数。

class Data
{
   
public:
	//无参构造函数
	Data()
	{
   
		_year = 2000;
		_month = 1;
		_day = 1;
	}
	//全参构造函数
	Data(int year = 2000,int month = 1, int day = 1)
	{
   
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main(void)
{
   
	Data d1;

	return 0;
}

在这里插入图片描述
不传参就可以调用的就是默认构造函数。

析构函数

析构函数的概念

析构函数是特殊的成员函数,析构函数与构造函数的功能相反,析构函数不是完全对对象本身的销毁,局部对象销毁工作时编译器完成的,而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。

析构函数的特性

1.析构函数名实在类名前面加上字符~
2.无参数无返回值

class Data
{
   
评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值