当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>C++递增(增量)运算符重载的考虑</b>[VC/C++编程]

赞助商链接



  本文“<b>C++递增(增量)运算符重载的考虑</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在前面的章节中我们已经接触过递增运算符的重载,当时刻我们并没有辨别前递增与后递增的差别,在普通情形下我们是辨别不出++a与a++的差别的,但的确他们直接是存在明显差别的.

先看以下代码:

#include<iostream>  
usingnamespacestd;  
intmain()  
{  
   inta=0; 
   ++(++a);//精确,(++a)返回的是左值 
   (a++)++;//错误,(a++)返回的不是左值 
   system("pause"); 
}

代码中(a++)++编译出错误,返回“++”需求左值的错误,这恰是前递增与后递增的差别招致的,那么又是为什么呢?

缘由主如果由C++对递增(增量)运算符的定义引发的.

他们之间的差别主要为以下两点:

1、运算历程中,先将对象举行递增改正,此后返回该对象(其实就是对象的引用)的叫前递增(增量)运算.在运算符重载函数中采取返回对象引用的方法编写.

2、运算历程中,先返回原有对象的值,此后举行对象递增运算的叫后递增(增量)运算.在运算符重载函数中采取值返回的方法编写(这也恰是前面(a++)++出错误的缘由,(a++)返回的不是引用,不能当作左值持续参与扩号外部的++运算),重载函数的内部实现必须成立一个用于暂时存储原有对象值的对象,函数返回的时刻就是返回该暂时对象.

那么在编写运算符重载函数的时刻我们该若何辨别前递增运算符重载函数与后递增运算符重载函数呢?

办法就是:在后递增运算符重载函数的参数中多加如一个int标识,标志为后递增运算符重载函数.

具体见以下实例(例一为非成员方法,例二为成员方法):

//例一 

//程序作者:管宁     
//站点:www.cndev-lab.com     
//全部稿件均有版权,如要转载,请务必闻名出处和作者   
#include<iostream>  
usingnamespacestd;  
classTest   
{   
   public:   
     Test(inta=0) 
     { 
       Test::a=a; 
     } 
   friendTest&operator++(Test&); 
   friendTestoperator++(Test&,int); 
   public: 
   inta; 
}; 
Test&operator++(Test&temp)//前递增 
{ 
   temp.a++; 
   returntemp; 
} 
Testoperator++(Test&temp,int)//后递增,int在这里只起到辨别作用,事实上并没有实际作用 
{ 
   Testrtemp(temp);//这里会调用拷贝构造函数举行对象的复制工作 
   temp.a++; 
   returnrtemp; 
} 
intmain() 
{ 
   Testa(100); 
   ++(++a); 
   cout<<a.a<<endl; 
   cout<<"察看后递增情形下暂时存储对象的值状况:"<<(a++).a<<endl;//这里恰是表现后递增操作先返回原有对象值地方 
   cout<<a.a<<endl; 
   (a++)++; 
   cout<<a.a<<endl;//由于后递增是值返回状况,所以(a++)++只对a做了一次递增操作,操作后为104而非105. 
   system("pause"); 
}

//例二 

//程序作者:管宁     
//站点:www.cndev-lab.com     
//全部稿件均有版权,如要转载,请务必闻名出处和作者   
#include<iostream>  
usingnamespacestd;  
classTest   
{   
   public:   
     Test(inta=0) 
     { 
       Test::a=a; 
     } 
   Test&operator++(); 
   Testoperator++(int); 
   public: 
   inta; 
}; 
Test&Test::operator++()//前递增 
{ 
   this->a++; 
   return*this; 
} 
TestTest::operator++(int)//后递增 
{ 
   Testrtemp(*this);//这里会调用拷贝构造函数举行对象的复制工作 
 
   this->a++; 
   returnrtemp; 
} 
intmain() 
{ 
   Testa(100); 
   ++(++a); 
   cout<<a.a<<endl; 
   cout<<"察看后递增情形下暂时存储对象的值状况:"<<(a++).a<<endl;//这里恰是表现后递增操作先返回原有对象值地方 
   cout<<a.a<<endl; 
   (a++)++; 
   cout<<a.a<<endl;//由于后递增是值返回状况,所以(a++)++只对a做了一次递增操作,操作后为104而非105. 
   system("pause"); 
}

通过对前后递增运算的解析,我们可以进一步可以理解到,关于相同情形的单目运算符重载我们都必须做好这些辨别工作,保证重载后的运算符符合要求.


  以上是“<b>C++递增(增量)运算符重载的考虑</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .