首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Increment/decrement operators

递增/递减运算符增加或减少对象的值。

Operator name

Syntax

Over?load?able

Prototype examples (for class T)

Inside class definition

Outside class definition

pre-increment

++a

Yes

T& T::operator++();

T& operator++(T& a);

pre-decrement

--a

Yes

T& T::operator--();

T& operator--(T& a);

post-increment

a++

Yes

T T::operator++(int);

T operator++(T& a, int);

post-decrement

a--

Yes

T T::operator--(int);

T operator--(T& a, int);

注释内置操作符的前缀版本返回引用和后缀版本返回值,并且典型的用户定义重载遵循这种模式,这样用户定义的操作符就可以与内置操作一样使用。但是,在用户定义的操作符重载中,任何类型都可以用作返回类型%28,包括无效%29。int参数是一个虚拟参数,用于区分操作符的前缀和后缀版本。当调用用户定义的后缀操作符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号%28e调用操作符来更改它。a.运算符++%282%29或运算符++%28a,2%29%29。

  • 内置运算符的前缀版本返回。参考文献和后缀版本返回价值,并且是典型的用户定义的重载遵循这种模式,这样用户定义的操作符就可以与内置操作一样使用。但是,在用户定义的操作符重载中,任何类型都可以用作返回类型%28,包括void29%。
  • int参数是一个虚拟参数,用于区分操作符的前缀和后缀版本。当调用用户定义的后缀操作符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号%28e调用操作符来更改它。g.a.operator++(2)operator++(a, 2)29%。

解释

预增量预减量运算符递增或递减对象的值,并返回对结果的引用。

后增量后减量创建对象的副本,递增或递减对象的值,并返回增量或递减之前的副本。

内置前缀运算符

对于每一种可选的易失性限定算术类型Abool,对于每个可选的易失性限定指针P要选择cv限定的对象类型,以下函数签名参与重载解析:

A& operator++(A&)

?

?

bool& operator++(bool&)

?

(deprecated)(until C++17)

P& operator++(P&)

?

?

A& operator--(A&)

?

?

P& operator--(P&)

?

?

内建前缀增量或递减运算符的操作数必须为可修改的%28非const%29。洛值非布尔型算术类型或指针以完成对象类型对于非布尔操作数,表达式++x完全等同于x += 1,以及表达--x完全等同于x -= 1,即前缀增量或递减是标识修改后的操作数的lvalue表达式。定义的所有算术转换规则和指针算术规则算术算子申请。

如果预增量运算符的操作数是类型的。bool,它被设置为true%28被反对%29。%28,直到C++17%29。

内置后缀操作符

对于每一种可选的易失性限定算术类型Abool,对于每个可选的易失性限定指针P要选择cv限定的对象类型,以下函数签名参与重载解析:

A operator++(A&, int)

?

?

bool operator++(bool&, int)

?

(deprecated)(until C++17)

P operator++(P&, int)

?

?

A operator--(A&, int)

?

?

P operator--(P&, int)

?

?

内建后缀增量或递减运算符的操作数必须为可修改的%28non-Const%29。洛值非布尔型算术类型或指针以完成对象类型.结果是prvalue操作数原始值的副本。作为副作用,对于非布尔操作数,表达式x++修改其操作数的值,就像通过计算x += 1,以及表达x--修改其操作数的值,就像通过计算x -= 1定义的所有算术转换规则和指针算术规则。算术算子申请。

如果后增量运算符的操作数是类型的。bool,它被设置为true%28被反对%29。%28,直到C++17%29。

二次

代码语言:javascript
复制
#include <iostream>
 
int main()
{
    int n1 = 1;
    int n2 = ++n1;
    int n3 = ++ ++n1;
    int n4 = n1++;
//  int n5 = n1++ ++;   // error
//  int n6 = n1 + ++n1; // undefined behavior
    std::cout << "n1 = " << n1 << '\n'
              << "n2 = " << n2 << '\n'
              << "n3 = " << n3 << '\n'
              << "n4 = " << n4 << '\n';
}

二次

产出:

二次

代码语言:javascript
复制
n1 = 5
n2 = 2
n3 = 4
n4 = 4

二次

注记

由于所涉及的副作用,必须谨慎地使用内置增量和递减操作符,以避免因违反排序规则...

因为对象的临时副本是在后期增量和后期递减期间构造的,预增量预减量运算符在不使用返回值的上下文中通常更有效。

标准库

对于许多标准库类型,增量和递减运算符都会被重载。特别是,Iterator重载运算符++和所有BidirectionalIterator重载操作符--即使这些运算符是特定迭代器的非操作操作。

算术类型的过载

*。

运算符++运算符++%28 int%29运算符--运算符%28 int%29增加或减少了STD的原子值的1%28公共成员函数::原子%29

运算符++运算符++%28int%29运算符--%28 int%29递增或减少STD的蜱数%28公共成员函数::chrono::工期%29

迭代器类型的重载

运算符++运算符++%28int%29提升std::RAW的迭代器%28公共成员函数[医]储物[医]迭代器%29

[医]迭代器%29

[医]迭代器%29

[医]插入[医]迭代器%29

[医]插入[医]迭代器%29

[医]迭代器%29

运算符++运算符++%28int%29提升std::iStream的迭代器%28公共成员函数[医]迭代器%29

运算符++运算符++%28int%29 NO-op%28公共成员函数[医]迭代器%29

运算符++运算符++%28int%29推进std::istreambuf的迭代器%28公共成员函数[医]迭代器%29

运算符++运算符++%28int%29 NO-op%28公共成员函数[医]迭代器%29

运算符++运算符++%28int%29将迭代器提升到下一个匹配%28公共成员函数std::regex[医]迭代器%29

运算符++运算符++%28int%29将迭代器推进到下一个子匹配%28公共成员函数std::regex[医]令牌[医]迭代器%29

另见

运算符优先...

操作者超载...

公共算子

*。

分配增量递减算术逻辑比较成员访问其他

a=b a+=b a-=b a%2A=b a/=b a%=b a&=b a=b a^=b a<=b a>>=b.+a-a+a-+a-+a-a+b a-b a%2Ab a/b a%b~a&b ab^b a<<b a>>b.%21 a&b a&b ab a=b a%21=b a<b a>b a<=b a>=b a乙%2AA&A->b A.B a->%2Ab a.%2AA%28...%29 a,b?*

特殊运算符

静态[医]强制转换将一种类型转换为另一种相关类型动态。[医]继承层次结构中的强制转换[医]强制转换添加或删除cv限定符,重新解释[医]CAST将类型转换为不相关的类型C风格的强制转换通过混合静态方式将一种类型转换为另一种类型[医]卡斯特[医]重释[医]强制转换新创建具有动态存储持续时间的对象,删除删除以前由新表达式创建的对象,并释放获得的内存区域大小查询类型的大小...查询参数Pack%28的大小,因为C++11%29 Tyid查询类型no的类型信息,除了检查。表达式可以抛出异常%28,因为C++11%29查询对齐要求类型为%28,因为C++11%29。

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com