递增运算符
形如"a++"、"++a"。如果a初始值为1,那么"a++"结果为1,但是实际上a等于2,先读取再加1;"++a"结果为2,实际也是2。这是对于基本运算类型,那么递增运算符重载的目的就是对于对象的属性也可以直接进行前置递增和后置递增。
由于成员函数里重载写的内容少,就详细分析成员函数实现递增运算符重载
递增运算符重载的实现
类结构如下:
class Addoperator { private: int _Num; public: Addoperator(int m) { _Num = m; } };
我的目的是直接输出类对象属性"A++",即cout<<A++<<endl;那么就需要先对左移运算符重载
左移运算符重载
示例:
//先对左移运算符重载 ostream& operator<<(ostream& cout, Addoperator A) { cout << A._Num; return cout; } //需要在类第一行加上友元 friend ostream& operator<<(ostream& cout, Addoperator A);
左移运算符重载在上篇博客以及详细介绍了,不理解的朋友可以去翻阅一下;由于_Num是私有属性 ,所以要在类内加上重载左移运算符函数是类友元的声明。
前置递增运算符重载
示例:
Addoperator& operator++() { _Num++; return *this; }
函数名还是采取编译器提供的规范名operator++ ,返回值类型为类引用,这是链式调用的形式,这样可以实现多次的前置递增运算,例如:"++(++A)";由于是在成员函数,这里不需要参数直接进行属性的递增;返回值是*this,前面讲到过this是指向成员属性的指针,this可以调用对象的属性,那么*this就是对象本身,通过返回其引用可以链式调用重载的前置递增运算符,示例:
void test01() { Addoperator A(1); cout <<++(++(++A)) << endl; cout << A << endl; }
运行效果:
注意事项1a
1、采用成员函数方法实现前置递增运算符重载不需要参数
2、通过返回对象的引用可以链式调用,非常方便
后置递增运算符重载
示例:
Addoperator operator++(int) { Addoperator temp = *this; _Num++; return temp; }
函数名也采用编译器提供的标准递增运算符,但是参数这里加了个int,这是函数进阶里提到的占位参数,可以只写一个数据类型放这儿,可以进行函数重载;很明显前置和后置递增重载的函数名相同,肯定需要进行函数重载的,而编译器就默认加上占位参数后为后置递增运算;由于后置递增是先读数据后操作,那么我就先创建一个对象来记录当前_Num的属性,然后进行递增,最后返回记录的对象属性即可;
调用:
void test02() { Addoperator B(0); cout << B++<< endl; cout << B++<< endl; cout << B << endl; }
运行效果:
注意事项b
1、虽然同时递增运算符重载,后置递增的运算却无法多次调用,不能链式调用,因为我们返回的引用是局部对象的引用,一旦返回,该对象地址就会被编译器清理,再调用的地址就会是新建的,因此这里最好不返回引用,直接返回值就行了,去掉"&"符号。
2、后置的递增运算符重载需要传入一个占位参数,用来进行函数重载;此外,函数重载和函数的返回值类型无关,就算去掉"&"也会进行函数重载。