【问题标题】:Why is it called operator overloading?为什么叫运算符重载?
【发布时间】:2018-08-26 21:32:40
【问题描述】:

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

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

我认为在这种情况下,(不管您可以通过std::addressof() 和其他惯用技巧获取此类对象的地址这一事实)没有办法访问/选择返回的原始一元 & 运算符调用对象的地址,我错了吗?

但是,通过重载,我了解到有一组函数将在编译时根据某些标准选择其中一个。但这种想法似乎与上述情况不符。

为什么它后来被称为重载而不是像重新定义替换之类的东西?

【问题讨论】:

  • @Zereges 我问的不是获取对象的地址,而是调用原来的& 运算符。
  • Foo : public BarBar* x = new Foo&*x 不会使用重载运算符;它没有被覆盖。你需要通过包含它的类型来访问它,所以它被重载了。
  • @Ryan 有趣的观察
  • 抱歉,再想一想,这具有误导性。术语很简单:是运算符本身——&,而不是Foo::operator&——被重载以对特定类型执行不同的操作。 int + intstring + string 等是 + 的重载。如果你认为它是ampersand(…)plus(…, …),它和函数重载是一样的。

标签: c++ c++11


【解决方案1】:

考虑以下代码:

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

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

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

【讨论】:

    【解决方案2】:

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

    当你将运算符重载为类的成员时

    1) 用第一个参数定义它应该是该类的一个实例

    2) 允许它访问该类的所有成员。

    仍然存在具有不同参数的 operator& 定义,并且您有非零的机会来创建操作符的使用会模棱两可的情况。

    【讨论】:

    • 也就是说,你说过:你只能给它添加新的用途,定义新的参数集。这就是为什么它称为重载而不是重新定义的原因。 它是关于扩展,而不是替换。 Related answer.
    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2013-07-30
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多