c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数。(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现)

业余实现代码:

 #include<iostream>
using namespace std;
class Test {
friend Test & operator--(Test &obj);
friend Test operator--(Test &obj, int);
public:
Test(int a = , int b = )
{
this->a = a;
this->b = b;
}
void display()
{
cout << "a:" << a << " b:" << b << endl;
}
public:
//前置++
Test & operator++()
{
this->a++;
this->b++;
return *this;
}
//后置++
Test operator++(int)
{
Test temp = *this;
this->a++;
this->b++;
return temp;
}
private:
int a;
int b;
};
//前置--
Test & operator--(Test &obj)
{
obj.a--;
obj.b--;
return obj;
} //后置--
Test operator--(Test &obj,int)
{
Test temp = obj;
obj.a--;
obj.b--;
return temp;
}
int main()
{
Test t1(, );
t1.display();
++t1;
t1.display();
--t1;
t1.display();
Test t2(, );
t2.display();
t2++;
t2.display();
t2--;
t2.display();
cout << "hello world!\n";
return ;
}

NOTE:

后置版本接受一个额外的参数(不被使用)int类型的参数(必须是int类型的)。当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参。尽管从语法上说后置函数可以使用这个额外的形参,但在实际过程中通常不会这样做。这个形参的唯一作用就是区分前置和后置版本的函数,而不是真的要在实现后置版本是参与运算。因为前置和后置版本的递增或者递减函数原型必须加以一个特殊的区分,c++语言选择增加一个占位参数实现后置版本。

如果我们想要通过函数的方式调用后置版本,则必须为它的整形参数传递一个值。

eg:

a.operator++(0);//调用后置版本,经测试,不用0也行,只要可以转换成int的任意数。

a.operator++();//调用前置版本

专业软件工程师实现方法:

 #include<iostream>
using namespace std;
class Test {
friend Test & operator--(Test &obj);
friend Test operator--(Test &obj, int);
public:
Test(int a = , int b = )
{
this->a = a;
this->b = b;
}
void display()
{
cout << "a:" << a << " b:" << b << endl;
}
public:
//前置++
Test & operator++()
{
this->a++;
this->b++;
return *this;
}
//后置++
Test operator++(int)
{
Test temp = *this;
++*this;
return temp;
}
private:
int a;
int b;
};
//前置--
Test & operator--(Test &obj)
{
obj.a--;
obj.b--;
return obj;
} //后置--
Test operator--(Test &obj,int)
{
Test temp = obj;
--obj;
return temp;
}
int main()
{
Test t1(, );
t1.display();
++t1;
t1.display();
--t1;
t1.display();
Test t2(, );
t2.display();
t2++;
t2.display();
t2--;
t2.display();
cout << "hello world!\n";
return ;
}

同样的思路在==和!=中也会用到(善于利用现有资源)^_^。

c++重载后置++和--的更多相关文章

  1. C++:重载前置++/--返回引用,重载后置++/--返回临时对象

    标准库中iterator对++/--的重载代码如下: _Myiter& operator++() { // preincrement ++*(_Mybase *)this; return (* ...

  2. C++中前置操作符和后置操作符的重载

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  3. C++语法小记---前置操作符和后置操作符

    前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...

  4. C++前置++与后置++的区别与重载

    ++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...

  5. C++之运算符重载(前置++和后置++)

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  6. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...

  7. 【M6】区别increment/decrement操作符的前置(prefix)和后置(postfix)形式

    1.考虑++(--的情况是一样的),前置是累加然后取出,后置是取出然后累加. 2.重载方法根据形参表的不同区分,问题来了,前置和后置形式都没有形参,因此没法区分.怎么办? 对于后置增加一个形参int, ...

  8. c++ 前置++与后置++的区别

    用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能.不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含 ...

  9. C++的前置++、后置++和前置--、后置--

    一.C++的前置++和后置++ 在C++中,运算符重载是你必须要掌握的重点,而前置++和后置++有什么区别呢?其实前置++和后置++是有关于 影响效率的问题,前置++比后置++的效率要高,原因是因为前 ...

随机推荐

  1. jquery之往一个CSS属性里写入多个值

    <html> <head> <title>test</title> <base href="<%=basePath%>&qu ...

  2. HTTP报文01

    #xiaodeng #HTTP报文01 #HTTP权威指南 45 报文向下游流动- 不管是请求报文还是响应报文,所有报文都会向下游流动. 所有报文的发送者都在接收者的上游. 报文的组成部分 对报文进行 ...

  3. map函数原理

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #map函数 #map函数会对一个序列对象中的每一个元素应用被传入的函数,并返回一个包含了所有函数调用结果的一 ...

  4. Linux 添加硬盘设备

    fdisk命令用于管理磁盘分区,格式为:“fdisk [磁盘名称]”. 管理Linux系统中的硬盘设备最常用的方法就当属是用fdisk命令了,这条命令提供了添加.删除.转换分区等等功能于一身的“一站式 ...

  5. office-word去掉效验红色的波浪线

         工作中,总是能发现不足.能再次学习到知识和经验!

  6. leetcode185 Department Top Three Salaries

    Employee表存储员工姓名.员工所在公寓.员工工资 Department表存储公寓id 评选出各个公寓的工资前三名的员工. 遇到的问题如下: limit,in等语句不能用在嵌套select语句中, ...

  7. 理解Lucene中的Analyzer

    学习一个库,最好去官网.因为很多库API变动十分大,从博客上找的教程都过时了. Lucene原理就是简简单单的"索引",以空间换时间.但是Lucene将这件事做到了极致,后人再有想 ...

  8. JavaScript 设计模式之代理模式

    一.代理模式概念解读 1.代理模式概念文字解读 代理,顾名思义就是帮助别人做事,GOF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象 ...

  9. java开发_eclipse导出为war文件,热部署到tomcat运行总结[转]

    在Myeclipse中,我们很容易做到这一步:把一个web项目生成war文件 其实在eclipse中,实现这样的功能,也是很简单的. 下面就看一下是怎样操作的吧! 新建一个web项目: 取名为:ecl ...

  10. 数组插件----linq.js

    优点 1.支持jQuery插件的方式.jquery.linq.min.js. 2.也可以像普通js方法一样使用.linq.min.js. 3.当然用习惯VS的童鞋肯定希望有个良好的智能感知,是的,它支 ...