前缀++ 后缀++ 运算符重载

前缀++ 后缀++ 运算符重载

2012-12-06 10:38 1733人阅读 评论(0) 收藏 举报

 分类:

C常用备查(24)  C++(43) 

下面例子程序中   const Fraction operator ++(int)   中   
  int不过是个哑元(dummy),是永远用不上的   
  它只是用来判断++是prefix   还是   postfix   
  记住,如果有哑元,则是postfix,否则,就是prefix   
  就像其他的一元算法和逻辑运算一样   
  而其实在C++中用到这种哑元的也只有在postfix   ++   和--了

例子:

int i=10;
cout<<i++<<endl;    //i=11;后缀加;先返回后自增;   10
cout<<++i<<endl;    //i=12;前缀加;先自增后返回;   12

例:

#include<iostream>
using namespace std;

class Fraction                                           //数类;
{
 friend ostream& operator<<(ostream& out, const Fraction& x);
private:
 int den;                                         //加的步进距离,使自加的距离不是1;
 int num;                                         //数(初值);
public:
 Fraction(int d=1, int n=0):den(d),num(n) {}
 Fraction& operator++()                           //前缀自加重载;(前置版本prefix)
  {
   num+=den;                        //先自增,再返回;
   return *this;
  }
 const Fraction operator ++(int)                  //后缀自加重载;(后置版本postfix)
  {
   Fraction old (*this);            //拷贝构造(对象参数是对象)。先返回,再自增;
   ++(*this);                       //调用的是重载的前置版本;
   return old;
  }
};

ostream& operator<<(ostream& out, const Fraction& x)
{
 out<<x.num<<endl;
 return out;
}

int main()
{
 Fraction b(10,10);
 cout<<b++<<endl;
 cout<<++b<<endl;
 return 0;
}

前置版本返回一个引用【Fraction& operator++()】,后置版本返回一个const值【const Fraction operator ++(int)】。

后置版本是利用前置版本来实现的。节约代码,控制代码有余。

前置版本的效率高,因为后置版本需要调用前置版本,所有后置版本效率比前置要低。(++i比i++效率高。)

在后置版本里,人为添加一个参数(int),主要是为了区别前置版本,这个参数不会被使用。

时间: 2024-10-14 15:59:23

前缀++ 后缀++ 运算符重载的相关文章

i++和++i的区别--后缀运算符效率研究

i++和++i的区别 如果使用内置的类型的话是没有太大区别的,内置类型比如说int 等. 如果使用的是class构造的对象,那么区别还是挺大的. 我们要先理解他们各自的工作方式. ++i我们成为前缀运算符,它是先自增,然后返回值 i++称为后缀运算符,它是先建立一个副本,自己递增,最后返回副本. 下面来解释一下为什么i++为何效率会这么低. 我们对++后缀运算符重载,我们就能发现其中的问题 class Time { public: Time operator++(int); Time opera

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

《C++编程思想》 第十一章 运算符重载 (习题+解答)

一.相关代码 1. /*运算符重载语法*/ /*OPOVER.cpp*/ /*这两个重载的运算符被定义为内联成员函数.对于二元运算符,单个参数是出现在运算符 右侧的那个.当一元运算符被定义为成员函数时,没有参数.成员函数被运算符左侧的对象调 用. 对于非条件运算符(条件运算符通常返回一个布尔值),如果两个参数是相同的类型,希 望返回和运算相同类型的对象或引用.如果它们不是相同类型,它作什么样的解释就取决于程 序设计者.用这种方法可以组合复杂的表达式: K += I + J ; 运算符+号产生一个

0718-----C++Primer听课笔记----------运算符重载

0.两个要点 a) 一个空类,编译器自动合成默认无参构造函数.析构函数.拷贝构造函数.赋值运算符. b) 在编写类的时候,必须严格区分对象是否可复制. 1.运算符重载之 string类 1.1 运算符重载的几个要点: a) 运算符重载可以有成员函数和友元函数的形式,后者比前者多一个参数. b) =和+=必须重载为成员函数的形式(不太理解原因). c) 输入和输出必须为友元函数的形式.而且输入操作符要考虑输入失败的情况. d) 运算符重载为成员函数的形式,那么该操作符的第一个操作数必然为该类的对象

C++ 运算符重载的注意点

运算符重载包括:双目运算符重载.单目运算符重载.流运算符重载.转换构造函数.类型转换函数 重载运算符的函数一般格式如下: 函数类型 operator 运算符名称 (形参表列) { // 对运算符的重载处理 } 1. 双目运算符重载 双目:有2个操作数的运算符 重载函数可以为类成员函数或者是类的友元函数: - 当是成员函数时,有一个隐藏参数(当前类),因此只有一个显示参数:如 Complex operator+(const Complex &b); Complex operator+(const

前置后置单目运算符重载函数返回值用法

Clock& Clock::operator ++() //前置单目运算符重载函数{Second++;if(Second>=60){Second=Second-60;Minute++;if(Minute>=60){Minute=Minute-60;Hour++;Hour=Hour%24;}}return *this;}//后置单目运算符重载Clock Clock::operator ++(int) //注意形参表中的整型参数{Clock old=*this;++(*this);retu

C#高级编程四十天----运算符重载

运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int sum = i+j; 如果可以使用代表附属的用户定义的类型来编写相同类型的表达式,那当然是最好不过的了: Complex i=5; Complex sum=i+j; 运算符重载允许为用户定义的类型重载(即指明明确的含义)诸如"+"这样的运算符.如果不进行重载,则用户需要编写以下代码: C

C++ Primer Plus学习笔记之运算符重载

C++ Primer Plus学习笔记之运算符重载 1,成员函数和友元函数选择的建议 下面我们先看两个例子: 成员函数重载 #include<iostream> using namespace std; class Complex { public: Complex(double r=0,double i=0) { re=r; im=i; } Complex operator+(const Complex& obj); Complex operator!(); void Display