Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189398
  • 博文数量: 54
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-02 18:41
文章分类

全部博文(54)

文章存档

2011年(1)

2009年(30)

2008年(23)

我的朋友

分类: C/C++

2009-04-04 00:16:08

参考自《More Effective C++中文版》

    当我们要设计一个类,并且对该类进行increment/decrement操作符重载时,必须遵循一个重要法则:一旦有顾虑,试看int类型行为如何并遵循之。我们在重载操作符时,要使其行为尽量地与编译器为之提供的靠拢,包括任何细节。

    increment操作符的前置式(prefix)意义:"increment and fetch"(累加后取出),后置式(postfix)意义:"fetch and increment"(取出后累加)。

    如下设计一个类:

    class UPInt{
    public:
        UPInt& operator++();        //前置式++

        const UPInt operator++(int);    //后置式++


        UPInt& operator--();        //前置式--

        const UPInt operator--(int);    //后置式--


        UPInt& operator+=(int);        //+=操作符,结合UPInt和int

    };

    //前置式:累加后取出(increment and fetch)

    UPInt& UPInt::operator++()
    {
        *this += 1;        //increment

        return *this;        //fetch

    }

    //后置式:取出后累加(fetch and increment)

    const UPInt UPInt::operator(int)
    {
        UPInt oldValue = *this;    //fetch

        ++(*this);        //increment

        return oldValue;
    }

    为什么要这么做呢?
    前置式,返回reference无多大问题,当然你也可以返回一个临时对象,但何必多此一举呢!
    后置式,为什么要返回一个const object呢?
 可以试着编译以下两行代码:
     int i = 0;
     i++++;          //error C2105: '++' needs l-value
    (注意:++++i是合法的)
     内建的int类型无此行为,这是后置式返回const object的原因之一。
     还有一个原因,如下:
         UPInt i;
         i++++;        // 等同于 i.operator++(int).operator++(int);
     即使能够两次施行后置式increment操作符,其行为也非你所预期。仔细看会发现:第二个operator++(int)所改变的是第一个operator++(int)返回的对象,而不是原对象,因此i只被累加一次而已。
 


     对于decrement操作符同increment操作符行为上一致。
 

 

阅读(747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~