在c ++中实现++运算符

时间:2014-07-25 22:10:34

标签: c++ operators

如何在c ++中定义标准++运算符?(c ++ 11)

例如。

int k, i=3;
k = i++;

首先指定i的值等于3然后递增i。

有人可以解释一下这是如何实现的吗?

另外,是由变量?

组成的副本

4 个答案:

答案 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