如何在c ++中定义标准++运算符?(c ++ 11)
例如。
int k, i=3;
k = i++;
首先指定i的值等于3然后递增i。
有人可以解释一下这是如何实现的吗?
另外,是由变量?
组成的副本答案 0 :(得分:6)
标准仅定义了它做什么,不是应该如何实现。
至于引用,你会在C ++标准的第5.2.6节[增量和减量]中找到它:
后缀的值 ++ expression是其操作数的值。 [注意:获得的值是原始值的副本-end note]操作数应为a 可修改的左值。操作数的类型应为算术类型 或指向完整对象类型的指针。操作数的值 通过向其添加1来修改对象,除非该对象是类型 bool,在这种情况下,它设置为true。 [注意:这个使用是 弃用,见附件D. -end note]的计算值 在修改操作数对象之前对++表达式进行排序。关于不确定顺序的函数调用, postfix的操作 ++是一个单一的评估。 [注意:因此,函数调用不应介入左值到右值的转换和侧面 与任何单个postfix ++运算符相关联的效果。 - 注意] 结果是一个prvalue。结果的类型是cv-unqualified 操作数类型的版本。
答案 1 :(得分:3)
当您为类重载时,您可以这样编码:
T& T::operator++() // pre-increment, return *this by reference
{
// increment something, somehow
// maybe there is local int i and you will type 'i = i + 1;' or '++i;'
// so whatever 'increment by one' means in your case.
// for type 'int', this function would result in (an instruction | a series of instructions)
// that increment the variable by one.
return *this;
}
T T::operator++(int) // post-increment
{
T copy(*this);
++(*this);// pre-increment here seems logical
return copy;
}
如您所见,在实际数据递增后创建并返回临时值。因此返回的值是旧值,同时递增实际值。
对于内置类型,它使用相同的逻辑。如何做到这一点取决于执行操作的人员,并且可能会有所不同。但它的工作方式相同。
答案 2 :(得分:2)
修复后的++,就像在i++
中一样,就像这样(在int的情况下):
int operator++(int i)
{
int temp = i;
i = i + 1;
return temp;
}
前缀++,如++i
中的那样(对于int):
int operator++()
{
return i + 1;
}
你知道为什么前缀++和 - 被认为更有效吗?
答案 3 :(得分:1)
你有C / C ++语言的前后增量。在递增之前返回预递增的值,后递增返回已经递增的值。
以下是维基百科的摘录:
int x;
int y;
// Increment operators
x = 1;
y = ++x; // x is now 2, y is also 2
y = x++; // x is now 3, y is 2
// Decrement operators
x = 3;
y = x--; // x is now 2, y is 3
y = --x; // x is now 1, y is also 1
有关Increment and decrement operators
的更多信息GCC Internals解释了这一点:
计算单个操作数的值,并且操作数递增或递减。在PREDECREMENT_EXPR和PREINCREMENT_EXPR的情况下,表达式的值是增量或减量后得到的值;在POSTDECREMENT_EXPR的情况下,POSTINCREMENT_EXPR是增量或减量发生之前的值。操作数的类型,如结果的类型,将是整数,布尔值或浮点数。
Unary and Binary Expressions - GNU Compiler Collection (GCC) Internals