目录
C++推出了运算符重载,旨在使一般的运算符达到更便捷的效果。对于日期类,+、-、++、--已是家常便饭。今天,我们就来看看几个常见的又容易混淆的运算符重载,前置++和后置++,以及取地址运算符重载。顺便提一嘴const修饰的成员函数。
运算符重载的基本规则
首先运算符的运算对象的个数不能改变。对于一元的运算符来说,参数就只有一个。二元函数,多元函数也同理。不过值得注意的是,若该运算符在类类型里重载为类的成员函数,参数就会在原来的基础上减一(实际上没有减少),这是由于原本的第一个参数会被视为this指针,this指针在参数是不显示的,但在函数内部可以显示地使用。
其次,运算符重载是具有特名字的函数,由operator和后面要定义的运算符共同构成,与一般函数相同,也有返回值和参数列表以及函数体。
不能重载的运算符:(.*、::、sizeof、?:、.)
前置++和后置++
operator++();
以上就是++运算符重载。可是前置++与后置++是由区别的,我们该如何命名区分这两个函数,函数内部又该如何实现呢。
首先是前置++,C++默认前置++的使用更加广泛,所以函数看起来更容易理解,请看代码:
Pra& operator++()
{
a++;
return *this;
}
而对于后置++,为了区分两者的区别,形参多了一个int,operator++(int),调用函数时a.operator(1),填3,10只要是整型都可以,且后置要返回++之前的值,不返回引用而直接返回类类型。
Pra operator++(int)
{
Pra d = *this;
a++;
return d;
}
取地址重载
取地址重载又分为非const修饰的取地址重载和const修饰的取地址重载。
- const Pra* operator&() const
- {
- return this;
- }
- Pra* operator&()
- {
- return this;
- }
对于取地址重载,即使我们不实现,编译器也会帮助我们实现。有一点比较坑的是,虽然const修饰的取地址重载也可以调用非const类型(权限缩小),但编译器还是会自动生成一个非const的,所以非const就不再调用const修饰的取地址重载了。
const修饰的成员变量
既然讲了const修饰的成员变量,就不得不再提一嘴const修饰的成员变量了。使用const修饰的
成员变量,参数就不能被修改了,举个简单的样例:
使用const修饰的成员变量时就不用再后置+const,可以直接使用。
这种方式一般用来防止错误修改属性,一般不修改属性时都可以给函数后置+const.