operator关键字和运算符重载模拟

时间:2012-07-07 19:35:23

标签: c++ operator-overloading

我知道我们可以对内在数据类型应用递增和递减,例如:

int a;

a++;
a--;

...等

但是,在以下代码中,如果省略行&中的operator int& ( ) { return value; },我将收到编译错误。请解释使用&如何以及为何使增量成为可能:

#include <iostream>

class Foo {

public:
   int value;
   operator int& ( ) { return value; }

};


int main ( ) {
    Foo p;
    p.value = 10;

    p++;

    std::cout << p <<  std::endl;

    std::cin.get ( );
    return 0;
}

1 个答案:

答案 0 :(得分:2)

此功能定义:

operator int&() { return value; }

允许从您的班级Foo转换为对int。

的引用

这一行:

p++;

无法将p增加为类型Foo,因为该类未实现operator++。但是,它可以通过调用int将p转换为operator int&()的引用,该value会在Foo的特定实例中返回对value的引用。对int的引用属于++类型,可以使用value递增。因此代码然后就地增加class Foo { public: Foo() : m_value(0) { } int getCopy() { return m_value; } int& getRef() { return m_value; } private: int m_value; }; int main() { Foo f; // Works f.getRef()++; // Does not work on g++ with 'error: lvalue required as increment operand` f.getCopy()++; }

至于返回in和int的引用之间的区别,以下代码显示您提到的行为与转换oeprator不同:

int

当转换运算符返回int&而不是{{1}}时,无法进行增量的原因是增量运算需要左值,即可以作为赋值目标的值。有关详细信息,请参阅here