【问题标题】:Overloading operators with non-member functions使用非成员函数重载运算符
【发布时间】:2011-04-23 05:35:06
【问题描述】:

这个问题的答案似乎让我无法理解,但是如何使用非成员函数进行重载。您是否只是创建一个程序级函数,而无论原型(或定义)存在于何处,该类类型的运算符都会被重载?

【问题讨论】:

    标签: c++ operator-overloading non-member-functions


    【解决方案1】:

    对于成员函数,this 将是左侧参数,这意味着您的运算符将只有一个参数(或者对于一元运算符没有参数)。对于独立函数,您必须分别为二元或一元运算符提供两个或一个参数。

    一个很好的例子是<< 流操作符:

    class T;
    
    // ...
    
    std::ostream & operator<<(std::ostream &os, const T &val)
    {
        // ...
        return os;
    }
    

    这里,os 是左侧参数,val 是右侧参数。

    至于“where”,操作符必须定义在你使用的地方。通常,将它们放在与您要为其重载运算符的类型相同的位置。

    编辑:

    对于非平凡的运算符(基本类型的算术运算),运算符是函数调用的语法糖。当你这样做时:

    std::cout << "Hello";
    

    就像这样写:

    operator<<(std::cout, "Hello");
    

    但更具可读性。

    对于成员运算符,左侧参数将是this(这就是成员运算符少一个参数的原因)。

    【讨论】:

    • 我猜std是命名空间而不是类,所以ostream是命名空间std中的freestadning函数?那么在这种情况下,成员函数和独立函数之间的区别在于它如何与它的操作数交互?
    • 不,函数的名称是operator&lt;&lt;std::ostream &amp; 是返回类型。但最终的区别在于,一个是方法(因此有一个this 指针),而另一个不是。
    • 我很想问一下,在这种情况下,std::ostream 代表什么,我知道它是返回类型,std 是命名空间,但 ostream 是什么?它在哪里适合命名空间?
    • std::ostream 是所有输出流的基类。 std::coutstd::ostream
    • 等待 ostream 是 std 命名空间中定义的类吗?
    最近更新 更多