Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
309 views
in Technique[技术] by (71.8m points)

c++ - operator overloading, member and non-member function, which one has priority?

Say I have a Complex number class and operator+ is overloaded twice, both as a member function and as a global function, for example:

class Complex {
public:
    Complex operator+(const Complex& c);
};
Complex operator+(const Complex& a, const Complex& b);

And in the main function I will call the operator+ like follows:

Complex a, b;
Complex c = a + b;

Which operator+ function will be called? Thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Members are not preferred over non-members in general, nor vice versa. C++'s overload resolution rules are applied to select one or the other.

A member function, for the purpose of overload resolution, is considered to have an implied object parameter (§13.3.1/2). So

Complex Complex::operator+(const Complex& c);

is treated as though it takes two arguments: the original const Complex& c, and another Complex& which refers to the object used to call the member function (in effect, *this).

Suppose we have two Complex variables:

Complex c1, c2;

Both c1 and c2 are non-const, so in order to call

c1.operator+(c2)

the parameter c, which is a const reference, has to bind to the non-const argument c2.

On the other hand, to call

operator+(c1, c2)

both parameters a and b, which are const references, have to bind to non-const objects, c1 and c2.

The member operator+ is better because const Complex&, Complex& is a better match for c1, c2 than const Complex&, const Complex& because it performs less qualification conversion. (§13.3.3.2/3)

If you change the declaration of the member operator+ to

Complex Complex::operator+(const Complex& c) const;

then the overload will become ambiguous, and compilation will fail.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...