C++成员函数 - 析构函数

析构函数

析构函数 是特殊的成员函数,其 特征 如下:
1. 析构函数名是在类名前加上字符 ~
2. 无参数无返回值类型。
3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重
4. 对象生命周期结束时, C++ 编译系统系统自动调用析构函数。

栈帧和栈里面的对象都要符合:

后进先出,也就是后定义先销毁/析构

对象空间的创建和销毁都是栈在管

所以析构函数只是清理资源,并不是销毁对象

全局的先创建和初始化

局部静态存储在静态区不在栈帧,在第一次运行的时候初始化

析构先清理在main函数栈帧里面的aa2和aa1

main函数结束后再调用全局和静态的,所以再清理aa4和aa0,接着清理aa3,符合后定义先析构

func3 传值返回返回的是aa的拷贝,aa要调用aa的拷贝构造,然后拷贝对象就销毁了

func4 传引用返回返回的是aa的别名

对于自定义类型,传引用返回比传值返回更高效

如果aa出了func4的作用域就销毁了,那么引用返回是有问题的

赋值运算符重载格式

参数类型 const T& ,传递引用可以提高传参效率
返回值类型 T& ,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
检测是否自己给自己赋值
返回 *this :要复合连续赋值的含义

对于任何一个类,只需要写一个>= 或者 <= 重载,剩下的比较运算符重载复用即可

比如日期类:

// d1 = d2
bool Date::operator==(const Date& d)
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}	

// d1 != d2
bool Date::operator!=(const Date& d)
{
	//return _year != d._year
	//	&& _month != d._month
	//	&& _day != d._day;
	return !(*this == d);
}

// d1 > d2
bool Date::operator>(const Date& d)
{
	if (_year > d._year
		|| (_year == d._year && _month > d._month)
		|| (_year == d._year && _month == d._month && _day > d._day)) // 年大
	{
		return true;
	}
	//else if (_year == d._year && _month > d._month) // 年一样比较月
	//{
	//	return true;
	//}
	//else if (_year == d._year && _month == d._month && _day > d._day) // 年月相等比较天
	//{
	//	return true;
	//}
	else
	{
		return false;
	}
}

当需要实现>=,<,等运算符时

可以直接复用

// d1 >= d2
bool Date::operator>=(const Date& d)
{
	return (*this > d || *this == d);
}

// d1 < d2
bool Date::operator<(const Date& d)
{
	return !(*this >= d);
}

// d1 <= d2
bool Date::operator<=(const Date& d)
{
	return !(*this > d);
}

相关推荐

  1. C++_函数

    2024-05-26 00:42:21       31 阅读
  2. C++】类和对象3:默认成员函数函数

    2024-05-26 00:42:21       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 00:42:21       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 00:42:21       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 00:42:21       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 00:42:21       20 阅读

热门阅读

  1. RabbitMQ01-liunx下安装及用户权限分配

    2024-05-26 00:42:21       10 阅读
  2. 物联网系统

    2024-05-26 00:42:21       10 阅读
  3. Python库之`lxml`的高级用法深度解析

    2024-05-26 00:42:21       14 阅读
  4. Math对象是什么?有什么用?

    2024-05-26 00:42:21       15 阅读
  5. C++ socket epoll IO多路复用

    2024-05-26 00:42:21       12 阅读
  6. python --创建固定字符串长度,先进先出

    2024-05-26 00:42:21       13 阅读
  7. 消息队列之Pulsar、kafaka、rabbitmq、mqtt、RocketMQ

    2024-05-26 00:42:21       11 阅读
  8. Excel超级表的注意事项

    2024-05-26 00:42:21       12 阅读