请参阅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
有人可以解释为什么会这样吗?为什么对第一个参数的类型有限制?
谢谢你。
请参阅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
有人可以解释为什么会这样吗?为什么对第一个参数的类型有限制?
谢谢你。
考虑一下:
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!
假设您有一个类型,Foo
使得这Foo f; int n;
两个表达式都有意义。f + n
n + 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
以便它可以访问该类的内部是有意义的。在我们的例子中,我们不需要这个,因为我们只是将调用传递给成员操作员。