I generally don't comment inside code, however I completely disagree with the frequently held view that one should just write readable code and then you don't need documentation.
What I do think should be documented is your interface. By that I mean there should be comments above classes and methods. Not simple methods like set and get of course.
People who use classes and methods written by you should not have to read your code to understand how to use them. So I think one should document what legal input and output ranges are as well as important invariants. E.g. a function takes a pointer as an argument. No matter how well you name your function it can never be obvious whether supplying NULL is valid or whether NULL is a valid returned result. Often -1 and 0 are used to signal some something like object searched for not found or similar. That should be documented.
Apart from that I think the key about documenting code is not to document what a class or method does or is, but what the intention behind it is.