”--“运算符重载
1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。
2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。
3、递增和递减分为前置和后置情况,a = ++b;(前置), a = b++;(后置)。因为符号一样,所以给后置版本加一个int形参作为区分,这个形参是0,但是在函数体中是用不到的,只是为了区分前置后置。例如:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Line{
public:
double x;
double y;
Line(double a, double b);
void sayLine();
Line operator--();
Line operator--(int); //后缀参数只能是int类型的;
};
Line::Line(double a, double b) {
x = a;
y = b;
}
void Line::sayLine(){
cout<<"x,y:"<<this->x<<","<<this->y;
}
Line Line::operator--() { //支持 --Line 运算
//Line line(0, 0);
x--;
y--;
return Line(x, y);
}
Line Line::operator--(int) { //支持 Line-- 运算
x--;
y--;
return Line(x, y);
}
int main() {
Line line(3, 4);
--line;
line--;
line.sayLine();
system("pause");
return 0;
}
在测试时,发现运算符同级是自左向右结合,但是有的运算符本身是自右向左结合,不知道这个会不会对重载运算符有影响。
”[]“运算符重载
#include<iostream>
#include<stdlib.h>
using namespace std;
const int SIZE =3;
class Lines {
public:
int x[SIZE] = {0,1,2};
int& operator[](int i) {
if (i >SIZE) {
cout << "数组越界" << endl;
return x[0];
}
return x[i];
};
};
int main() {
Lines line;
cout<<line[1]<<endl;
cout<<line.x[5]<<endl;
cout << line[5] << endl; //这才是已经重载的【】符号
system("pause");
}