1

请参阅C++ FAQ 精简版

它规定了二进制中缀算术运算符:

member functions don't allow promotion of the left hand argument, since that 
would change the class of the object that is the recipient of the member 
function invocation

有人可以解释为什么会这样吗?为什么对第一个参数的类型有限制?

谢谢你。

4

2 回答 2

7

考虑一下:

struct Number {
    Number(int val) : val(val) {  }    // *Not* explicit
    int val;                           // Everything public to simplify example

    Number operator+(Number const& other) const { return val + other.val; }
};

Number n(42);
Number result = 32 + n;    // Doesn't compile

但是,如果我们删除了成员运算符并使其成为自由函数:

Number operator+(Number const& a, Number const& b) { return a.val + b.val; }

Number n(42);
Number result = 32 + n;    // Compiles!
于 2012-11-29T02:14:42.237 回答
3

假设您有一个类型,Foo使得这Foo f; int n;两个表达式都有意义。f + nn + f

通过重载成员operator+,您只能实现f + n

struct Foo
{
    Bar operator+(int n) const;       // binds to "Foo + int"
    // ...
};

您永远无法int + Foo从成员运营商那里获得其他版本。解决方案是定义自由运算符,它可以用于任何涉及至少一种用户定义类型的签名。事实上,我们可以像这样回收成员运算符:

Bar operator+(int n, Foo const & f)   // binds to "int + Foo"
{
    return f + n;                     // recycle existing implementation
}

当您只有friend一个免费的运算符重载时,通常将其设为 a ofFoo以便它可以访问该类的内部是有意义的。在我们的例子中,我们不需要这个,因为我们只是将调用传递给成员操作员。

于 2012-11-29T02:15:28.277 回答