Operator overloading : member function vs. non-member function?

后端 未结 2 825
無奈伤痛
無奈伤痛 2020-11-22 04:50

I read that an overloaded operator declared as member function is asymmetric because it can have only one parameter and the other parameter passed automatically is

2条回答
  •  长情又很酷
    2020-11-22 05:19

    If you define your operator overloaded function as member function, then the compiler translates expressions like s1 + s2 into s1.operator+(s2). That means, the operator overloaded member function gets invoked on the first operand. That is how member functions work!

    But what if the first operand is not a class? There's a major problem if we want to overload an operator where the first operand is not a class type, rather say double. So you cannot write like this 10.0 + s2. However, you can write operator overloaded member function for expressions like s1 + 10.0.

    To solve this ordering problem, we define operator overloaded function as friend IF it needs to access private members. Make it friend ONLY when it needs to access private members. Otherwise simply make it non-friend non-member function to improve encapsulation!

    class Sample
    {
     public:
        Sample operator + (const Sample& op2); //works with s1 + s2
        Sample operator + (double op2); //works with s1 + 10.0
    
       //Make it `friend` only when it needs to access private members. 
       //Otherwise simply make it **non-friend non-member** function.
        friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
    }
    

    Read these :
    A slight problem of ordering in operands
    How Non-Member Functions Improve Encapsulation

提交回复
热议问题