Source: http://pages.cs.wisc.edu/~gerald/cs368/stanford/Ch10_OperatorOverloading.pdf