六一的部落格


关关难过关关过,前路漫漫亦灿灿。



建议定义为类的成员函数: 改变所操作的对象

建议同时定义前置版本和后置版本


前置版本和后置版本

  1. 普通的重载形式无法区分这两种情况

    后置版本接受一个额外的(不被使用)int类型形参, 编译器传入0

    因为不会用到, 可以不给出形参名字

  2. 前置版本返回左值, 后置版本返回右值

  3. 后置版本的实现会使用前置版本


递增运算符

  1. 前置版本
    1StrBlobPtr &operator++()
    2{
    3    check(curr, "increment past end of StrBlobPtr");
    4    ++curr;
    5    return *this;
    6}
  2. 后置版本
    1StrBlobPtr operator++(int)
    2{
    3    StrBlobPtr ret = *this;
    4    ++*this;
    5    return ret;
    6}

递减运算符

  1. 前置版本
    1StrBlobPtr &operator--()
    2{
    3    --curr;
    4    check(curr, "decrement past begin of StrBlobPtr");
    5    return *this;
    6}
  2. 后置版本
    1StrBlobPtr operator--(int)
    2{
    3    StrBlobPtr ret = *this;
    4    --*this;
    5    return ret;
    6}

显式调用

1var.operator++(0);        // 后置版本
2var.operator++();         // 前置版本

运算符重载: 递增和递减运算符


建议定义为类的成员函数: 改变所操作的对象

建议同时定义前置版本和后置版本


前置版本和后置版本

  1. 普通的重载形式无法区分这两种情况

    后置版本接受一个额外的(不被使用)int类型形参, 编译器传入0

    因为不会用到, 可以不给出形参名字

  2. 前置版本返回左值, 后置版本返回右值

  3. 后置版本的实现会使用前置版本


递增运算符

  1. 前置版本
    1StrBlobPtr &operator++()
    2{
    3    check(curr, "increment past end of StrBlobPtr");
    4    ++curr;
    5    return *this;
    6}
  2. 后置版本
    1StrBlobPtr operator++(int)
    2{
    3    StrBlobPtr ret = *this;
    4    ++*this;
    5    return ret;
    6}

递减运算符

  1. 前置版本
    1StrBlobPtr &operator--()
    2{
    3    --curr;
    4    check(curr, "decrement past begin of StrBlobPtr");
    5    return *this;
    6}
  2. 后置版本
    1StrBlobPtr operator--(int)
    2{
    3    StrBlobPtr ret = *this;
    4    --*this;
    5    return ret;
    6}

显式调用

1var.operator++(0);        // 后置版本
2var.operator++();         // 前置版本