重载++/--运算符

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

今天看书,看到例子里有个重载自增运算符,前自增还比较好。看后自增的时候有点迷惑。查 c++primer才发现自己这里有知识漏洞。特此补上。

 

在为类定义自增自减运算符的时候要注意,如何区分前自增/自减 和 后自增/自减运算符。

 

1 定义前自增/自减运算符

 

class CheckedPtr{

public:

     CheckedPtr& operator++();

     CheckedPtr& operator--();

 

};

 

 

 

CheckedPtr& CheckedPtr::operator++()

{

if(curr==end)

throw out_of_range("");

++curr;

return* this;

}

 

CheckedPtr& CheckedPtr::operator--()

{

if(curr==beg)

throw out_of_range("");

--curr;

return* this;

}

 

 

为了与内置类型一致,前缀形式操作符返回被增或者减量对象的引用。

 

 

2 区别前缀和后缀形式

由于前缀和后缀的形参数目和类型相同,普通的重载不能区别所定义的前缀操作和后缀操作

 

后缀的形式要接收一个额外、无用的int型参。使用后缀式时编译器自动提供0作为实参,它的唯一目的是使用后缀函数与前缀函数区分开。

 

3 后缀形式操作符

 

 

class CheckedPtr{

public:

     CheckedPtr operator++(int);

     CheckedPtr operator--(int);

 

};

CheckedPtr& CheckedPtr::operator++()

{

CheckedPtr ret(*this);

++*this;

return ret;

}

 

CheckedPtr& CheckedPtr::operator--()

{

CheckedPtr ret(*this);

--*this;

return ret;

}

 

 

先是保存状态,然后调用自己前面定义的前缀操作。

 

PS:以上全部内容来自《C++ Primer》

 

 

 

C/C++/运算符重载总结(史上最简单易懂!!!) 所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。我们以简单的一个点Point类来说明各运算符重载的具体实现,在实际的工作学习中,我们一般根据自己的需求来重写我们自己的运算符重载。 代码如下: #include... 阅读详情

相关推荐

++运算符重载

运算符重载运算符与类结合,产生新的含义。 运算符重载的作用:为了实现类的多态性(多态是指一个函数名有多种含义) 实现运算符重载的方式:类的成员函数 或 友元函数(类外的普通函数) ++--运算符重载: 1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。 2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指...

canvasa的博客 5004

【C++入门】运算符重载详解

(1)运算符运算符分为算术运算符(+-、*、/)、关系运算符(=、!=、==)、逻辑运算符(&&、!)等;(2)运算符重载:给运算符赋予新的含义,可以根据运算符操作的对象进行恰当的操作;(3)不是所有的运算符都支持运算符重载,有的运算符的含义在任何情况下都是确定的,所以不需要重载

weixin_42031299的博客 3303

C++中的 运算符重载

C++的 各种运算符重载:加号、左移、递增、赋值、关系、函数调用

qq_24472227的博客 4671

C++ 运算符重载(超详细)

下面说明为什么:如果cout写在后面,也是可以的,但是想要输出p,我们就要这么写:p << cout,两者的顺序要反一下,同理,用成员函数重载的话,cout就一定在p后面了。

Mo3328679412的博客 4163

【C++运算符重载

一、运算符重载的基本概念 我们知道C++预定义的运算符,只能用于基本数据类型的运算 如:整型,实型,字符型,逻辑型....... 运算符如:+-、*、/、%、&、~、!、|、=、<<、>>、!=、..... 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。 二、运算符重载的形式 1、运算符重载的实质是函数重载 2、可以重载为普通函数,也可以重载为成

weixin_55664293的博客 6523

C++运算符重载++/--前缀后缀、成员与友元函数实现解析

C++运算符重载是扩展自定义类型行为的重要机制,其中一元自增自减运算符++/--)的重载最能考验开发者对值语义和引用语义的理解。标准规定重载函数的参数中必须包含自定义类型或枚举类型,因此无法直接为内置 int 添加新的自增规则,只能通过包装类来模拟其行为,这就是常说的整数重载要求。实现时需要严格区分前缀与后缀:前缀返回当前对象的引用,以保证 ++(++obj) 等链式操作可用;后缀需先保存旧值再修改对象,并以值返回临时旧对象。成员函数与友元函数两条路线各有优劣,前者内聚性好,适合迭代器、游标等自增自减类型

weixin_33178839的博客 217

c++/oop---运算符重载

c++/oop---运算符重载 重载为普通函数 #include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; cla...

liankewei的博客 93

C++ 运算符重载深入学习总结笔记

运算符重载引入 1. 从函数重载说起 函数重载是在一定作用域内,多个相同名称但不同参数列表的函数重载 编译时由编译器根据实际调用时给的实参情况来判定本次实际用哪个函数, 这个过程叫重载决策 重载函数本质上就是多个独立函数, 重载机制在编译时发生,运行时不参与 函数重载的意义就是避免我们胡乱起名,方便编写类库覆盖所有可能操作,是一种语法糖 2. 什么是运算符重载 什么是运算符?譬如 + - * / % 等算术运算符和 > < == != 等关系运算符就是典型的可重载运算符(但不是所有的运算符

xUeeeto_的博客 1001

C++/CLI学习入门(十):类的运算符重…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> C++/CLI中可以对运算符进行重载,但与本地C++有所区别。同时对于运算符重载,数值类和引用类也存在不同要求。下面以例子开始,了解C

dieqms的专栏 513

C++ 重载前置和后置++/--运算符

要想同时定义前置和后置运算符,必须首先解决一个问题,即普通的重载形式无法区分这两种情况。前置和后置版本使用的是同一个符号,意味着其重载版本所用的名字将是相同的,并且运算对象的数量和类型也相同。 为了解决这个问题,后置版本接受一个额外的(不被使用) int类型的形参。当我们使用后置运算符时,编译器为这个形参提供一一个值为0的实参。尽管从语法上来说后置函数可以使用这个额外的形参,但是在实际过程中通常不会这么做。这个形参的唯一作用 就是区分前置版本和后置版本的函数,而不是真的要在实现后置版本时参与运算。 ...

zidian666的博客 674

运算符重载

在研究类的默认成员函数的时候我们接触到了运算符重载,其中包括赋值操作符重载 取地址操作符重载 const 修饰的取地址操作符的重载 运算符重载实际上是对运算符函数的重载来实现的 话不多说直接上代码来看 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class complex { p...

flf1234567898的博客 182

C++运算符重载

友元函数重载运算符 运算符重载:赋予运算符具有操作自定义类型数据功能;运算符重载的实质就是函数调用。 写法: 函数返回值 函数名(函数参数) 函数返回值是由运算符运算完成后的值决定;函数名是由 operator加上重载运算符组成函数名; 参数:看运算符的操作数,具体参数个数看重载函数形式是什么。 #include<iostream> using namespace std; calss AA { public: AA(int a,int ...

g5371的博客 518

运算符重载+ -两种方法以及前后置++/--实现

#include using namespace std; /* 全局函数 类成员函数方法实现运算符重载步骤 1)要承认操作运算符是一个函数,写出函数名称 2)根据操作数,写出函数参数 3)根据业务,完善函数返回值(看函数但是返回引用 还是指针 元素),以及实现函数业务 */ class Complex { public: friend Complex operator+(

小强博客 3831

C++重学 运算符重载

运算符重载 [] () = -> * 只能通过成员函数重载 << >> 只能通过全局函数重载 不要重载&& || ,失去短路规则 成员函数实现重载 全局函数实现 输入/输出运算符重载 friend ostream &operator<<( ostream &output, ...

我是要成为海贼王的男人! 197

赋值运算符重载函数[C/C++/C#]

From:  http://zhedahht.blog.163.com/blog/static/25411174200741543224391/ 问题:给出如下CMyString的声明,要求为该类型添加赋值运算符函数。 class CMyString { public:     CMyString(char* pData = NULL);     CMyString(con

Vast_Sea的专栏 1340

C++/类与对象/默认成员函数@赋值运算符重载拷贝函数

C++/类与对象/默认成员函数@赋值运算符重载拷贝函数

blue的博客 1256

C++/马石安/重载赋值运算符(=)函数的返回值

重载赋值运算符(=)函数的返回值 Q:为什么返回值要设置为对象的引用? A:实现对象的连续赋值操作 #include <iostream> #include <cstring> using namespace std; class Namelist { char *name; public: Namelist(); virtual ~Namelist(){}; Namelist(char *p) { name = new cha

xc_nrn的博客 851

C# 学习笔记(五) ++/--运算符重载的意义

++--运算符重载 的 目的 在于 控制 执行变量以以何种方式

一切从心开始 1312
上一篇: Traits技术
下一篇: 11,12月计划
hycoldrain
博客等级 码龄20年 7粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值