Pointers, then templates and then OOP (that's in chronological order) were the hardest parts for me. It took me ages to fully understand OOP; in fact I finally got my head around it when I read Oracle's Java tutorial and it explained about objects being like real objects in that they have a state and a behaviour. As an example, a monitor has a few states - on, off, on and drawing, on and idle: