Increment/decrement operators
增量/递减算子
递增/递减运算符增加或减少对象的值。
Operator name | Syntax | Overloadable | Prototype examples (for class T) |
---|---|---|---|
Inside class definition | Outside class definition | ||
pre-increment | ++a | Yes | T& T::operator++( |
pre-decrement | --a | Yes | T& T::operator--( |
post-increment | a++ | Yes | T T::operator++(int |
post-decrement | a-- | Yes | T T::operator--(int |
注释内置操作符的前缀版本返回引用和后缀版本返回值,并且典型的用户定义重载遵循这种模式,这样用户定义的操作符就可以与内置操作一样使用。但是,在用户定义的操作符重载中,任何类型都可以用作返回类型%28,包括无效%29。int参数是一个虚拟参数,用于区分操作符的前缀和后缀版本。当调用用户定义的后缀操作符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号%28e调用操作符来更改它。a.运算符++%282%29或运算符++%28a,2%29%29。
- 内置运算符的前缀版本返回。
参考文献
和后缀版本返回价值
,并且是典型的用户定义的重载遵循这种模式,这样用户定义的操作符就可以与内置操作一样使用。但是,在用户定义的操作符重载中,任何类型都可以用作返回类型%28,包括void
29%。
- 大
int
参数是一个虚拟参数,用于区分操作符的前缀和后缀版本。当调用用户定义的后缀操作符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号%28e调用操作符来更改它。g.a.operator++(2)
或operator++(a, 2)
29%。
解释
预增量
和预减量
运算符递增或递减对象的值,并返回对结果的引用。
后增量
和后减量
创建对象的副本,递增或递减对象的值,并返回增量或递减之前的副本。
内置前缀运算符
对于每一种可选的易失性限定算术类型A
除bool
,对于每个可选的易失性限定指针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。
内置后缀操作符
对于每一种可选的易失性限定算术类型A
除bool
,对于每个可选的易失性限定指针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。
例
二次
#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';
}
二次
产出:
二次
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。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。