CS253: Software Development with C++

Spring 2021

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:

Arguments

Arguments

Foo f;
Bar b;
result = f + b;

There are two ways to implement the binary + operator:

Of course, they each need a return type. The method should const, since + doesn’t alter its left operand, unless you have extremely peculiar semantics.

Arguments

Foo f;
result = *f;

There are two ways to implement the unary * operator:

Return types are needed, and the method might be const, depending on the semantics.

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. This will call a.operator+=(b):

Fraction a, b;
a += b;

This will call a.operator=(b.operator-(c)):

Fraction a, b, c
a = b - 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

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.