c++重载后置++和--
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++重载后置++和--的更多相关文章
- C++:重载前置++/--返回引用,重载后置++/--返回临时对象
标准库中iterator对++/--的重载代码如下: _Myiter& operator++() { // preincrement ++*(_Mybase *)this; return (* ...
- C++中前置操作符和后置操作符的重载
1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++ // i 的值作为返回值,i 自增 1: ...
- C++语法小记---前置操作符和后置操作符
前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...
- C++前置++与后置++的区别与重载
++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...
- C++之运算符重载(前置++和后置++)
今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...
- # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符
c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...
- 【M6】区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
1.考虑++(--的情况是一样的),前置是累加然后取出,后置是取出然后累加. 2.重载方法根据形参表的不同区分,问题来了,前置和后置形式都没有形参,因此没法区分.怎么办? 对于后置增加一个形参int, ...
- c++ 前置++与后置++的区别
用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能.不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含 ...
- C++的前置++、后置++和前置--、后置--
一.C++的前置++和后置++ 在C++中,运算符重载是你必须要掌握的重点,而前置++和后置++有什么区别呢?其实前置++和后置++是有关于 影响效率的问题,前置++比后置++的效率要高,原因是因为前 ...
随机推荐
- 简单的 Helper 封装 -- CookieHelper
using System; using System.Web; namespace ConsoleApplication5 { /// <summary> /// Cookie 助手 // ...
- 24、java操作xml方法
XML解析方式 1. SAX解析方式 SAX(simple API for XML)是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一边扫描一边解析.而且 ...
- hosts.allow hosts.deny
简单控制访问ip,hosts.allow/hsots.deny a simple access control language that is based on client (host name ...
- PHP5.5新特性
详情见:http://www.php.net/manual/zh/migration55.new-features.php 1. 生成器 yield关键字 yield的中文文档在这里:http://p ...
- Ant build xml中的各种变量解释
Ant build.xml中的各种变量 Ant环境变量分为四种: 1. build.properties文件中定义的变量 2. build.xml文件中定义的变量, 3. ...
- Java编程性能优化一些事儿【转】
原文出处: 陶邦仁 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载 ...
- 【转】对 Go 语言的综合评价
以前写过一些对 Go 语言的负面评价.现在看来,虽然那些评价大部分属实,然而却由于言辞激烈,没有点明具体问题,难以让某些人信服.在经过几个月实际使用 Go 来构造网站之后,我觉得现在是时候对它作一些更 ...
- 使用用户自定义类型作为map的key
有时候我们想把用户自定义类型作为std::map的键值.方法一)最简单的方法就是实现该自定义类型的<操作符,代码如下:class Foo{public: Foo(int num_) ...
- 使用latex撰写博士,硕士学位论文(浙大博士经验分享)
使用latex撰写博士,硕士学位论文(浙大博士经验分享) 浙大博士: 个人感觉,还是要用latex来写.因为之前发过几篇word排版的中文论文,在参考文献的引用.文字格式调整上,实在是难受.如果坚持 ...
- mysql-5.7 Using Asynchronous I/O on Linux详解
一.mysql - innodb 使用异步IO的场景 总的来说innodb 只会对数据文件采用异步IO,为了保存日志是真正被写入到磁盘,innodb不会对日志文件启用异步IO 更新细一步的说,inno ...