CS253: Software Development with C++

Spring 2020

Operator Functions

Show Lecture.OperatorFunctions as a slide show.

CS253 Operator Functions

The List

Yes, = is an operator, just like + is. Sure, = usually alters its left operand, whereas + doesn’t, but C++ doesn’t care about that.

What can’t you do?

You cannot:

Spell it out

    Fraction a, b;
    a = b + 1.2;  // ok
    a = 3.4 + b;  // bad

Use previous work

The Hagia Sophia

Consider these addition methods:

The smart programmer will have operator+= do the real work, have operator+ and preincrement invoke +=, and have postincrement call preincrement.

More re-use

For that matter, define operator-= in terms of operator+= (if negation is cheap for your class). Then, as before, you can have operator- and predecrement call operator-=, and have postdecrement call predecrement.

Methods

When possible, implement operator overloading as methods (as part of the class). When the method is called, the left operand is *this and the right operand is the argument.

    Fraction a, b; a += b;

That will call a.operator+=(b).

    Fraction a, b, c
    a = b - c;

That will call a.operator=(b.operator-(c)).

Non-member functions

Sometimes, you can’t use a method (method ≠ function, right?):

    Fraction a, b;
    a = 1.2 + b;

If operator+ were a method, it would have to be a method of double. That wouldn’t work, so it must be a non-member function, a free function:

    Fraction operator+(double, const Fraction &);

Of course, you still need the method that handles Fraction+double. Function overloading is your friend.

Abuse

Java doesn’t allow operator overloading, supposedly because it’s too confusing. There is something to be said for that.

Resist the urge to redefine every 💣 ☠†※! operator possible. Only define those that:

Example of abuse

A misguided programmer might define a-b, where a and b are strings, to mean “return a, without the chars that are also in b”.

string operator-(string a, const string &b) {
    for (size_t p=0; (p = a.find_first_of(b, p)) != a.npos;)
        a.erase(p, 1);
    return a;
}

int main() {
    const string name = "Bjarne Stroustrup";
    cout << name-"aeiou" << '\n';
}
Bjrn Strstrp

Maybe, maybe not. 🤷 Call it remove_chars(), instead.