Overloaded operators

advertisement
Chapter 14 Operator
Overloading:
What does + mean?
Consider the code below. Note the multiple uses of “+”.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a,b=5,c=8;
string x, y = “Five”, z = “Six”;
a = b + c;
x = y + z;
cout << a << “ “ << x << endl;
}
The operator “+” is an overloaded
operator.
That is, it has different meanings
depending on how it is used (its context).
Programmers can give new meaning
to existing operators.
This is operator overloading.
Example: if x and y are objects, what
does x+y mean?
What if x and y are fractions?
x = a/b and y = c/d;
Then x + y= (ad+bc)/bd?
P. 547 shows overloadable operators.
Fraction case study Section 14.2.
Also on program demo.
Step through various constructors
Discuss the normalize method
Overloaded Operators: implement as
member functions or non-member
functions (aka helper functions).
Note that there are some of each in
demo07.
Which is best?
Fraction class: code shows ‘+’
operator as both member and helper,
though if one is used the other
commented out.
If a member function then x+y is the
same as x.operator+(y)
Thus, x+2 is OK because 2 is
automatically promoted to a fraction
using the default constructor
but 2+x is not OK since it is
interpreted as 2.operator+(x)
Similar to example on p. 549.
If a helper function, either is OK.
See code.
Similar comments for other arithmetic
operators ‘-’, ‘*’, and ‘/’.
Note the productivity hint on page
559.
Note the productivity hint on page
560.
Note the advanced topic on page 561.
This is important because it’s a basic
design issue – when to use member
functions or helper functions.
Same issue as with ‘+’ … symmetry is
important with the ‘==‘ (and other
comparison) operators
Overloading the ++ operators – page
564.
Note that one returns a reference and
the other returns a copy.
Note the prose on page 565
Note the quality tip on page 565.
Skip the section on overloaded
operators and iterators. It requires
things we’ve not covered yet.
Overloading the assignment operator
p. 568.
Not done for the Fraction class;
C++ provides its own overaloded
operator – THOUGH THIS CAN GET
YOU IN TROUBLE!!! (more later in
the semester).
See the productivity hint on page 568.
Overloading conversion operators.
Remove comments around the
double operator.
Note the error. What is it telling you?
Adds ambiguity to the code. C++
does not know what to do.
For example, the overloaded operator
a = a+2 does not work if the
conversion operator double() is
included in the class definition.
Compiler error that detects there is an
ambiguity between the two.
Reason:
Compiler sees “b=a+2” and must
interpret “+”.
It knows that 2 can be converted to a
fraction and could use the + that adds
two fractions.
It also knows that “a” can be
converted to a double and can use
the + that adds a double and an int.
Thus the message “error C2666:
‘operator`+’’ : 2 overloads have
similar conversions”.
More at
[http://support.microsoft.com/default.a
spx?scid=kb;en-us;106392].
Removing the double() conversion
operator will fix this.
Can also fix by adding additional
overloaded operators. For example:
Fraction operator+(int left, const Fraction& right)
{
Fraction temp(left);
return temp + right;
}
This would allow an expression of the
form a = 2 + a.
However, would need yet another
overloaded operator to allow a + 2.
Note the tips, errors, and advanced
topics on pages 570-2.
Putting explicit before the constructor
Fraction (int t) prevents the automatic
conversion from an int to a Fraction in
a+2.
Overloading the subscript operator:
See the SafeArray class on p. 573
AND the code snippet from the notes.
The [] operator hides the details of
how an element is accessed.
This is WHY we do encapsulation.
Note that the overloaded operator is
written as a member function.
Note the error if I try to write x[2] = 99
in the main code.
Must write another overloaded operator[]
(non-constant) that returns int& (i.e. an
lvalue).
Functions that overload operators
should return reference types if the
operator will be used as an lvalue.
See example on p. 574 on
overloading the function call operator.
Again, must be written as a member
function.
Program demo08 has overloaded operators <<
and >>. At this point it’s mostly just a matter of
replacing read() and write() methods with >> and
<<. However, later when templates are discussed
you’ll see that you can define a single << or >>
operator to work with ANY array. In the overloaded
operator code you’ll apply << or >> to each array
element which could be any type or class. This
allows a single method to be used with a large
range of types. Very generic.
Demo08 does show how this can be done.
Put a break point in the Manager destructor
and show how writing BOTH the account
and customer lists is done via the SAME
overloaded << operator.
Download