析构函数
析构函数
是特殊的成员函数,其
特征
如下:
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);
}