operator重载 —— 运算符篇
概念
运算符重载和操作符重载的方式类似,都是用operator
+ 重载的操作符
特性
此处类比两种运算符看才能看得懂注意事项里的表达逻辑
复合赋值运算符
如:+=
、-=
、前置++
、后置++
注意事项
- 不能用const修饰传入参数
- 因为要改变变量的值
- 最好传引用,返回类型为引用
- 因为要改变变量本身,所以最终返回的值就是变量本身
- 不仅要返回运算的结果,还要赋值给变量,因此直接返回该对象的引用
算数运算符
如:+
、-
、*
注意事项
- 返回的类型不能是引用
- 原因:返回的值一般是由该函数中创建的变量提供,此变量的生命周期和函数一样,因此一旦出了函数,变量就会销毁,如果返回该变量的引用,就会导致悬空引用。再者,返回类型是引用的话,不会调用拷贝构造生成临时变量。
日期类代码示例
获取每个月的天数
int GetMonthDay(int year, int month)
{
// 用static修饰数组为静态数组,整个生命周期只用开辟一次
static int a[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2 && ((year % 4 == 0 && year % 100 ! = 0) || (year % 400 == 0)))
return 29;
return a[month];
}
复合赋值运算符
+=
操作符重载(日期 + 天数)
class Date
{
// ...
Date& operator+=(int day)
{
_day += day;
while (_day > GetMonthDay(_month))
{
_day -= GetMonthDat(_month);
_month++;
if (_month == 13)
{
_month == 1;
_year += 1;
}
}
return *this;
}
}
-=
(日期 - 天数)
class Date
{
// ...
Date& operator(int day)
{
_day -= day;
while (_day < 1)
{
--_month;
if (_month < 1)
{
_month == 12;
--_yera;
}
_day += GetMonthDay(_year, _month);
}
return *this;
}
}
-=
(日期 - 日期)
class Date
{
int operator-=(const Date& d)
{
Date maxDate = *this;
Date minDate = d;
if (*this < d)
{
maxDate = d;
minDate = *this;
}
int count = 0;
while (minDate ! = maxDate)
{
++minDate;
++count;
}
return count;
}
};
算数运算符
+
(日期 + 天数)
class Date
{
Date operator+(day) const
{
Date tmp = *this;
return tmp += day;
}
};
-
(日期 - 天数)
class Date
{
Date operator-(int day) const
{
Date tmp = *this;
return tmp -= day;
}
};
-
(日期 - 日期)
class Date
{
int operator(int day)
{
Date tmp = *this - day;
return tmp;
}
};
++
类运算符
前置++
不用传参,后置++
的参数类型规定传int
,但是不需要定义变量
前置++
Date operator++();
后置++
Date operator++(int);
前置++
class Date
{
operator++()
{
return *this += 1;
}
}
后置++
class Date
{
Date operator++(int)
{
Date tmp = *this;
*this += 1;
return tmp;
}
}