Главная страница | назад





Article #15407: Operator Overloading

 Question and Answer Database

FAQ407C.txt   Operator Overloading
Category   :C/C++ Language Issues
Platform    :All
Product    :BC++  5.x

Question:


What is operator overloading?


Answer:


Basics of operator overloading: using an operator like "a + b" is like
calling a function with 2 parameters "operator+(a,b)" or calling a member
function "a.operator+(b)". Note: the former 2 expressions are valid C++
expressions and can be used in programs.

overloading operator "+" between type A and B is in fact overloading the
function "operator+(A,B)" or the member function "operator+(B)" of the A
class (A must be a class in this case of course).

So defining a "+" and "+=" operation for a complex classes could be:

 class complex
 {
 public:
   double re, im;

   complex() {}
   complex(double r, double i = 0) : re(r), im(i) {}
   complex& operator+=(const complex& a)
   {
     re += a.re;
     im += a.im;
     return *this;
   }
 };

 inline complex operator+(const complex& a, const complex& b)
 {
   return complex(a.re + b.re, a.im + b.im);
 }


You can use them as follow:

 complex a(1,-1), b(2,2);
 complex c = a + b; // c will be (3,1). Same as c = operator+(a,b);
 c += a; // c will be (4,0). Same as c.operator+=(a);



Note: operator+() could also have been defined as a member function.

Some special points of operators:

 - You can only overload operators if at least one operand is a class,
structure or reference to class or structure. If every operand were built-in types, that would mean redefining an existing or forbidden
operation.

 - You cannot overload "::" (scope operator) "?:" (ternary operator) "." 
and ".*" (member resolution operators).

 - "->" and "->*" are special, can be only defined as unary member functions
returning a type supporting the "->" or "->*" operator (generally a pointer
to a class or structure)

 - operator "=" (assignment operator) have special behavior like copy
constructors (and it's one of the most important operator...) and can only be
defined as a member function.

 - postcript "++" and "--" operator differs from their non-postfix 
counterpart using a dummy "int" argument: "operator++(A)" defines "++a" while
"operator++(A,int)" defines "a++".

 - special operators called cast operators (always member functions) defined
as "operator ()" without return types are used to define a conversion
to another type.

 - the call operator (member function) emulates a function call. Example:

 struct functor
 {
   int operator()(int, int);
 };

 functor f;
 int result = f(2,3);



7/2/98 10:32:32 AM
 

Last Modified: 01-SEP-99