Source: https://web.stanford.edu/class/cs107l/handouts/03-Operator-Overloading.pdf