Overloading the stream insertion (<<) operator for a class

前端 未结 3 1034
野性不改
野性不改 2021-01-23 06:50

It is often overloaded as a friend function of the class. Is there any way it can be overloaded as a member function?

3条回答
  •  无人及你
    2021-01-23 07:16

    Is there any way it can be overloaded as a member function?

    No. The signature of the function prevents this option.

    // Binary operator where the stream object is left of '<<' and the object
    // instance is right of '<<'
    std::ostream& operator<<(std::ostream& lhs, const Foo& rhs)
    

    For illustration here's a binary operator+ as a free function:

    class Foo
    {
    };
    
    Foo operator+(const Foo& lhs, const Foo& rhs)
    {
        // an appropriate implementation
    }
    
    int main()
    {
        Foo f1;
        Foo f2;
    
        // Uses the free function
        Foo result = f1 + f2;
    
        return 0;
    }
    

    However implemented as a member function it looks like this:

    class Foo
    {
    public:
        Foo operator+(const Foo& other) const
        {
            // an appropriate implementation
        }
    };
    
    int main()
    {
        Foo f1;
        Foo f2;
    
        // The calling sequence is the same as before however 'f1' is logically
        // the same as 'lhs' in the free function implementation example (i.e.,
        // the first type in the binary operator must be the class type when
        // implemented as a member function)
        Foo result = f1 + f2;
    
        return 0;
    }
    

    Given the operator+ member function example it is easier to see why the std::ostream& operator<<(std::ostream& lhs, const Foo& rhs) free function cannot be converted to an equivalent member function. Because 'lhs' would need to be the same type as std::ostream but this is only possible when implementing that class whereas in this example the Foo class is being implemented.

提交回复
热议问题