为什么称为运算符重载?

时间:2017-05-21 20:08:53

标签: c++ c++11

如果定义了以下类Foo。据说重载 一元&符号&)运算符:

class Foo {
public:
   Foo* operator&() { return nullptr; }
};

我认为在这种情况下,(无论你可以通过std::addressof()和其他惯用技巧获得这样一个对象的地址这一事实),无法访问/选择原始的一元&符号运算符返回调用对象的地址,我错了吗?

通过重载但是,据我所知,有一组函数可以在编译时根据某些条件选择一个函数。但这种想法似乎与上述情况不符。

为什么它会被称为重载而不是重新定义替换等其他内容?

2 个答案:

答案 0 :(得分:7)

请考虑以下代码:

int x;
Foo y;
&x; // built-in functionality
&y; // y.operator&();

我们有两个不同类型的变量。我们对它们都应用相同的&运算符。对于x,它使用内置的address-of运算符,而对于y,它会调用用户定义的函数。

这正是你所描述的重载:有多个功能(好吧,其中一个是内置功能,而不是真正的“功能”)并且它们是基于选择的关于操作数的类型。

答案 1 :(得分:1)

您无法在C ++中重新定义函数或运算符,只能向其添加新用法,从而定义新的参数集。这就是为什么它称重载而不是重新定义的原因。

当您重载运算符作为类的成员时

1)用第一个参数将其定义为该类的实例

2)授予该类所有成员的访问权限。

仍然有operator&的定义带有不同的参数,并且您有非零的机会造成使用operator的情况不明确的情况。