【问题标题】:What is meant by non-member operator overloading非成员运算符重载是什么意思
【发布时间】:2013-03-17 21:52:41
【问题描述】:

我最近浏览了一篇关于运算符重载的文章,其中提到了非成员运算符重载。如果有人能用一个例子解释非成员运算符重载的含义,我将不胜感激。我知道什么是成员运算符重载(类中重载运算符类型(二进制..等)的方法。我在 SO 上遇到了这个post,这让我相信非成员运算符重载的目的是处理运算符重载,其中第一个参数不是类,而只是本机类型。任何解释非成员运算符重载的链接或示例都将受到赞赏。

【问题讨论】:

  • 您提供的链接显示了非成员运算符重载的示例,如您所说的那样在原语上执行添加
  • This 可能会有所帮助...

标签: c++ operator-overloading


【解决方案1】:

这意味着你可以在类外重载:

struct X { int data; };

bool operator<(X const& a, X const& b) 
{
       return a.data < b.data;
}

这对于不对称重载很有用,其中左操作数不需要是您自己的类型:

bool operator<(int a, X const& b) 
{
       return a < b.data;
}

这里的一个常见习惯用法是将其与 in-class 定义和朋友声明结合起来:

struct X 
{ 
    int data; 
    friend bool operator<(X const& a, X const& b) { return a.data<b.data; }
    friend bool operator<(int a, X const& b) { return a<b.data; }
};

这里,operator&lt; 在技术上仍然是成员。

正如下面 DrewDormann 所指出的,另一个有用的副作用是 (X const&amp;, X const&amp;) 将适用于任何可隐式转换为 X const&amp; 的操作数,而不仅仅是该确切类型的表达式。

【讨论】:

  • 它对于对称类型转换也很有用,允许对所有涉及的操作数进行隐式类型转换。
【解决方案2】:

最常见的方法是重载运算符std::cout 上调用:

namespace X { 
      class MyClass { 
       ...
       };  
}
std::ostream& operator<< (std::ostream&, const X::MyClass&);

这是在 std::ostream 成员上调用的,因此您无需在类中定义它。 但是有时无法通过公共接口实现该功能(因为您的操作员需要访问数据表示)。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2015-06-23
    • 1970-01-01
    • 2013-05-07
    • 2015-09-18
    • 2017-03-29
    • 2011-03-16
    • 2011-07-09
    相关资源
    最近更新 更多