Source: https://stanford.edu/class/archive/cs/cs106l/cs106l.1162/course-reader/Ch10_OperatorOverloading.pdf