左值和右值

通俗的说,左值可以取地址的,有名字的,是非临时的。
右值,不能取地址的,没有名字的,临时的,通常生命周期就在某个表达式之内的就是右值。

后置单目运算符 ++和—重载规则

  • 如果要重载 ++或—为类成员函数,使之能够实现表达式 oprd++ 或 oprd— ,其中 oprd 为A类对象,则 ++或— 应被重载为 A 类的成员函数,且具有一个 int 类型形参。
  • 经重载后,表达式 oprd++ 相当于 oprd.operator ++(0)

    前置++和后置++:

    ++i在C++里面的定义最后返回的是被++的对象的引用(系统就是这么实现的),所以++i可以作为左值,即可以写:++i=3 ,后缀式操作符接受一个额外的int型形参(不会使用它,仅做区分用)。
    i++在C++里面的定义是,最后返回的是被++的对象的值(系统就是这么实现的),所以i++不可以作为左值,即不可以写:i++=3 。

    示范代码:

    ```cpp

    include

    using namespace std;

class Point { int _x, _y; public: Point(int x=0, int y=0) : _x(x), _y(y) {} Point& operator++(); Point operator++(int); Point& operator—(); Point operator—(int); friend ostream& operator << (ostream& o, Point& p); };

Point& Point::operator++() { _x++; _y++; return this; } / ++i在C++里面的定义最后返回的是被++的对象的引用(系统就是这么实现的),所以++i可以作为左值,即可以写:++i=3 */

//后缀式操作符接受一个额外的int型形参(不会使用它,仅做区分用) Point Point::operator++(int) { Point temp = this; ++this; //复用了前缀++的重载 return temp;

//后缀式版本中,返回值是尚未自增的原值,但对象本身已经做了自增操作了。

} / i++在C++里面的定义是,最后返回的是被++的对象的值(系统就是这么实现的),所以i++不可以作为左值,即不可以写:i++=3 /

Point& Point::operator—() { _x—; _y—; return *this; }

Point Point::operator—(int) { Point temp = this; —this; return temp; }

//友元函数,返回值类型为ostream&,可以支持<<级连操作 ostream& operator << (ostream& o, Point& p) { o << ‘(‘ << p._x << “, “ << p._y << ‘)’; return o; }

int main() { Point p(1, 2); cout << p << endl; cout << p++ << endl; cout << ++p << endl; cout << p— << endl; cout << —p << endl; return 0; } ```