CS253: Software Development with C++

Spring 2021

Extensible Not Mutable

Show Lecture.ExtensibleNotMutable as a slide show.

CS253 Extensible Not Mutable

Extensible, not mutable

Extending

int main() {
    string sin = "Impeached: ";
    string all = sin + 17 + ' ' + 42 + ' ' + 45*2;
    cout << all << '\n';
}
c.cc:3: error: no match for 'operator+' in 'sin + 17' (operand types are 
   'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} and 'int')

That failed, because you can’t use + on a std::string and an int.

Extending

string operator+(const string &s, int n) {
    return s + to_string(n);
}

int main() {
    string sin = "Impeached: ";
    string all = sin + 17 + ' ' + 42 + ' ' + 45*2;
    cout << all << '\n';
}
Impeached: 17 42 90

Hooray! C++ is extensible! I extended the language to include string + int.

For all I know, there’s some obscure (that means something I don’t know) line of the C++ standard that forbids overloading operators with all built-in and std:: operands.

More Extending

class Fraction {
    int top, bot;
  public:
    Fraction(int num, int den) : top(num), bot(den) { }
    double get() const { return top*1.0/bot; }
};

int main() {
    Fraction f(355, 113);
    cout << f << '\n';
}
c.cc:10: error: no match for 'operator<<' in 'std::cout << f' (operand types 
   are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Fraction')

Of course, that failed. << has no idea what to do with an ostream (output stream) and a Fraction.

More Extending

class Fraction {
    int top, bot;
  public:
    Fraction(int num, int den) : top(num), bot(den) { }
    double get() const { return top*1.0/bot; }
};

ostream & operator<<(ostream &os, const Fraction &f) {
    return os << f.get();
}

int main() {
    Fraction f(355, 113);
    cout << f << '\n';
}
3.14159

How operators work

Mutation

Consider this surprising result:

cout << "Tuesday" + 3;
sday

I don’t like this. I want it to simply append a "3" to the string. Let’s redefine it!

Futility

string operator+(const char *p, int n) {
    return p + to_string(n);
}

int main() {
    cout << "Tuesday" + 3;
}
c.cc:1: error: 'std::__cxx11::string operator+(const char*, int)' must have an 
   argument of class or enumerated type

More Futility

string operator%(const char *p, int n) {
    return p + to_string(n);
}

int main() {
    cout << "Tuesday" % 3;
}
c.cc:1: error: 'std::__cxx11::string operator%(const char*, int)' must have an 
   argument of class or enumerated type