Source: http://courses.cms.caltech.edu/cs11/material/advcpp/lectures/cs11-advcpp-lec1.pdf