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