详解C++类中六大成员函数(构造,析构,拷贝构造,赋值运算符重载,取地址运算符重载)

一、构造函数

class Date
{
public:
	Date(int year = 2020, int month = 11, int day = 9)
	//初始化列表成员
		:_year(year)
		,_month(month)
		,_day(day)
	{
		//这里可以再次进行赋值
	}
	
private:
	int _year;
	int _month;
	int _day;
}; 
int main()
{
	Date a(2020, 11,9);
	return 0;
}

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

  • 如果没有自己编写构造函数,则编译器自动生成。如果已经编写,则编译器不在生成。
  • 默认构造函数:编译器自动生成的, 无参构造函数,全缺省构造函数(三者只能存在一个)
  • 构造函数的虽然名称叫构造,但是需要注意的是构造函数的主
    要任务并不是开空间创建对象,而是初始化对象。
  • 支持重载
  • 类中有自定义成员,调用改类的构造函数时自动调用自定义成员的默认构造函数,如果没有,编译器报错。

二、析构函数

class Date
{
public:
	Date(int month = 10, int day = 20)
		:_year(2000)
		,_month(month)
		,_day(day)
	{

	}
	~Date() 
	{
	}
private:
	int _year;
	int _month;
	int _day;
}; 

析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

  • 析构函数名是在类名前加上字符 ~。
  • 无参数无返回值。
  • 不支持重载
  • 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数(如果有堆上的空间,则需要自己编写析构函数来释放掉,系统生成的不会释放)。
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  • 类中有自定义成员,调用改类的析构函数时自动调用自定义成员的析构函数

三、拷贝构造

class Date
{
public:
	Date(int year = 2020, int month = 11, int day = 9)
		:_year(year),
		_month(month),
		_day(day)
	{

	}
	Date(const Date& d) //使用引用,否则会造成无穷递归,
						//即创建临时变量时再次调用拷贝构造
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
}; 

int mian()
{
	Date a(2020, 11, 9);
	Date b(a);
	return 0;
}

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用

  • 拷贝构造函数是构造函数的一个重载形式。
  • 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
  • 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
  • 如果有申请的堆上的空间,则需要显示定义拷贝构造函数。完成深拷贝。

四、赋值运算符重载

class Date
{
public:
	Date(int year = 2020, int month = 11, int day = 9)
		:_year(year),
		_month(month),
		_day(day)
	{

	}
	~Date() {
		cout << "haha" << endl;
	}

	Date(const Date& d) 
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};
int mian()
{
	Date a;
	Date b(2000, 1,1);
	b = a;
	return 0;
}

让一个对象去修改一个已经存在的对象,使其内容一致。

  • 如果没有显示定义,编译器自动生成,完成浅拷贝。
  • 如果类中有资源,则需要显示定义函数,完成深拷贝。
  • 如果需要连续赋值,一般返回当前类的引用。
  • 通过 *this != &对象 判断是否给自己赋值。

五 & 六、取地址运算符重载和 const 取地址运算符重载

用来获取对象的地址。

  • 一般不需要显示定义,使用编译器自动生成的即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值