运算符重载
本质是函数调用,内置类型编译器直接比,自定义就去找对应类内重载的函数
如果定义在类外,需要访问私有的成员函数,只能将成员函数权限变为Public或者友元(非必须不用)
,所以一般重载函数都写在类内
底层看到都是一样的函数调用
定义
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
注意:
不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数
用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
.
操作符是几个操作数,重载函数就有几个参数
一般除了三目运算符都是2个
标题解决访问私有成员函数
显示写出this指针,但其实不需要写,编译器自动
bool operator<(const Date& x2)
{
if (_year < x2._year)
{
return true;
}
else if (_year == x2._year && _month < x2._month)
{
return true;
}
else if (_year == x2._year && _month == x2._month && _day < x2._day)
{
return true;
}
return false;
}
设置在类内,就解决了
底层同样都是调用类内重载函数,实际上用肯定用d1 < d2
如果设置在类外,也不是必须设置到类内,只是类内比较方便
赋值运算符重载
首先搞清楚 d1 = d2; 并不是拷贝构造,而是去调用运算符重载函数
其次就是 d1 = d2 = d3这种连等的情况
i = 1; 返回值是1—为赋值后的结果
>此写法不支持连续赋值,没有返回值
void operator=(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
返回值的结果应该是如图所示
正确写法
精华的点就是 return *this 为什么能返回,是*this因为出了函数作用域还在,在main函数里是个实例化对象
还有一种情况是 d1 = d1 ;
自己给自己赋值,可以允许,也可以不允许
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
还要注意默认生成的会和类外自己写的冲突,所以只能定义在类内