Source: https://voyager.deanza.edu/~bentley/cis22b/OperatorOverloading.pdf