• 如何区分前置和后置呢?
    • 前置作为一元运算符重载
      • 重载为成员函数:

T & operator++();
T & operator—();

  1. - 重载为全局函数

T1 & operator++(T1);
T1 & opeartor—(T2);

  • 后置作为二元运算符重载,多写一个没有的参数
    • 重载为成员函数

T & oepartor++(int);
T & oepartor—(int);

  1. - 重载为全局函数

T1 & oepartor++(T2, int);
T1 & oepartor—(T2, int);

  • 如果没有后置重载,而有前置重载的情况下。VS中,obj++也调用前置重载,而dev中出错
    1. main() {
    2. CDemo d(5);
    3. cout << (d++) << ","; // 等价于 d.operator++(0);
    4. cout << d << ",";
    5. cout << (++d) << ","; // 等价于 d.operator++();
    6. cout << d << endl;
    7. cout << (d--) << ","; // 等价于 d.operator--(d,0);
    8. cout << d << ",";
    9. cout << (--d) << ",";
    10. cout << d << endl;
    11. }
    12. 输出:
    13. 5677
    14. 7655
    对上面的去求,可编出如下的CDemo类
    1. class CDemo {
    2. private:
    3. int n;
    4. public:
    5. CDemo(int i=0):n(i){}
    6. CDemo & operator++(); // 前置形式
    7. CDemo operator++(int); // 后置形式
    8. operator int() { return n;} // 用于 cout << d
    9. friend CDemo & operator--(CDemo &); // 全局的
    10. friend CDemo operator--(CDemo & , int);
    11. };
    12. CDemo & CDemo::operator++() {
    13. ++n;
    14. return *this;
    15. } // ++s即为s.operator++();
    16. CDemo CDemo::operator++(int k) {
    17. CDemo tmp(*this);
    18. n++;
    19. return tmp; // 返回修改前的对象
    20. }
    21. CDemo & operator--(CDemo & d) {
    22. d.n--;
    23. return d;
    24. }
    25. CDemo operator--(CDemo & d, int) {
    26. CDemo tmp(d);
    27. d.n--;
    28. return tmp;
    29. }
  • 前置形式++返回引用,可执行 (++a)=1,但后置的不行
  • 全局的前置++必须传入引用,因为要修改
  • 可见前置的比后置的运算快

    注意实现

  1. 不允许定义新的运算符
  2. 重载后要符合日常习惯
  3. 运算符重载不改变运算符的优先级
  4. 一下运算符不能重载:“.”“.*”“::”“?:”“sizeof”
  5. 重载运算符()、[]、->或者赋值运算符=时,运算符重载函数必须声明为类的成员函数