积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

1) 不论是 increment 或 decrement 的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++
规定后缀形式有一个 int 类型参数,当函数被调用时,编译器传递一个 0 做为 int 参数的值
给该函数(即:decrement函数)。示例如下:
/******************************************************************************
@-Author  : Jacc.Kim
@-create  : [11-25-2013 20:33:55]
@-summary : c++的increment与decrement学习
@-modified: 
*****************************************************************************
*/
class UPInt
{
public:
    
/**************************************************************************
    @-summary : ++ 前递增操作符重载
    @-in param: 
    @-return  : 
    @-!!!note : 1) 该函数返回的是当前对象自增后的引用。一定注意:是引用。
    @-          2) 该函数没有输入参数
    @-          3) 下面的 -- 前递减操作符重载类似
    *************************************************************************
*/
    UPInt 
&operator++() {
        
// 处理递增操作
        
// 
        
// some code here ..
        
// 
        
// 返回自身实例
        return *this;
    }

    
/**************************************************************************
    @-summary : ++ 后递增操作符重载
    @-in param: 
    @-return  : 
    @-!!!note : 1) 该函数返回的是当前对象自增前的一个const副本。一定注意:是const副本。
    @-          2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
    @-          3) 下面的 -- 后递减操作符重载类似
    *************************************************************************
*/
    
const UPInt operator++(int) {
        UPInt retObj 
= *this;
        
++(*this);
        
return retObj;
    }

    
/**************************************************************************
    @-summary : -- 前递增操作符重载
    @-in param: 
    @-return  : 
    @-!!!note : 1) 该函数返回的是当前对象自减前的引用。一定注意:是引用。
    @-          2) 该函数没有输入参数
    *************************************************************************
*/
    UPInt 
&operator--() {
        
// 处理递减操作
        
// 
        
// some code here ..
        
// 
        
// 返回自身实例
        return *this;
    }

    
/**************************************************************************
    @-summary : ++ 后递减操作符重载
    @-in param: 
    @-return  : 
    @-!!!note : 1) 该函数返回的是当前对象自减前的一个const副本。一定注意:是const副本。
    @-          2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
    *************************************************************************
*/
    
const UPInt operator--(int) {
        UPInt retObj 
= *this;
        
--(*this);
        
return retObj;
    }

public:
    UPInt();
    
virtual ~UPInt();

};
//class UPInt

/******************************************************************************
@-summary : 示例使用UPInt的 ++ 与 -- 的前、后操作符重载
@-in param: 
@-return  : 
*****************************************************************************
*/
void testUPIntIncAndDecOperator() {
    UPInt theObj;
    
++theObj; // 调用 theObj.operator++(); 
    theObj++// 调用 theObj.operator++(0);
    --theObj; // 调用 theObj.operator--(); 
    theObj--// 调用 theObj.operator--(0);
}


2) 为什么前缀与后缀的返回值会不同??
答:一个后缀 increment 必须返回一个对象(它返回的是增加前的值),但是为什么
是 const 对象呢?假设不是 const 对象,下面的代码就是正确的:
UPInt i;
i++++; // 两次 increment 后缀
这组代码与下面的代码相同:
i.operator++(0).operator++(0);
很明显,第一个调用的 operator++函数返回的对象调用了第二个 operator++函数。
有两个理由导致我们应该厌恶上述这种做法,第一是与内置类型行为不一致。当设计一
个类遇到问题时,一个好的准则是使该类的行为与 int 类型一致。而 int 类型不允许连续进
行两次后缀 increment:
int i;
i++++; // 错误!
第二个原因是使用两次后缀 increment 所产生的结果与调用者期望的不一致。如上所
示,第二次调用 operator++改变的值是第一次调用返回对象的值,而不是原始对象的值。
因此如果:
i++++;
是合法的,i 将仅仅增加了一次。这与人的直觉相违背,使人迷惑(对于 int 类型和 UPInt
都是一样),所以最好禁止这么做。

3) 同样条件下,前缀比后缀操作符来的高效。
posted on 2013-11-25 20:50 Jacc.Kim 阅读(703) 评论(0)  编辑 收藏 引用 所属分类: VC / C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理