- 如何区分前置和后置呢?
- 前置作为一元运算符重载
- 重载为成员函数:
- 前置作为一元运算符重载
T & operator++();
T & operator—();
- 重载为全局函数
T1 & operator++(T1);
T1 & opeartor—(T2);
- 后置作为二元运算符重载,多写一个没有的参数
- 重载为成员函数
T & oepartor++(int);
T & oepartor—(int);
- 重载为全局函数
T1 & oepartor++(T2, int);
T1 & oepartor—(T2, int);
- 如果没有后置重载,而有前置重载的情况下。VS中,obj++也调用前置重载,而dev中出错
对上面的去求,可编出如下的CDemo类main() {
CDemo d(5);
cout << (d++) << ","; // 等价于 d.operator++(0);
cout << d << ",";
cout << (++d) << ","; // 等价于 d.operator++();
cout << d << endl;
cout << (d--) << ","; // 等价于 d.operator--(d,0);
cout << d << ",";
cout << (--d) << ",";
cout << d << endl;
}
输出:
5,6,7,7
7,6,5,5
class CDemo {
private:
int n;
public:
CDemo(int i=0):n(i){}
CDemo & operator++(); // 前置形式
CDemo operator++(int); // 后置形式
operator int() { return n;} // 用于 cout << d
friend CDemo & operator--(CDemo &); // 全局的
friend CDemo operator--(CDemo & , int);
};
CDemo & CDemo::operator++() {
++n;
return *this;
} // ++s即为s.operator++();
CDemo CDemo::operator++(int k) {
CDemo tmp(*this);
n++;
return tmp; // 返回修改前的对象
}
CDemo & operator--(CDemo & d) {
d.n--;
return d;
}
CDemo operator--(CDemo & d, int) {
CDemo tmp(d);
d.n--;
return tmp;
}
- 不允许定义新的运算符
- 重载后要符合日常习惯
- 运算符重载不改变运算符的优先级
- 一下运算符不能重载:“.”“.*”“::”“?:”“sizeof”
- 重载运算符()、[]、->或者赋值运算符=时,运算符重载函数必须声明为类的成员函数