Operator overloading Makes classes act like built-in types Eg: output operator: ostream& operator<<(ostream &os, const List& list) { ... return os; }