The can, but it's usually preferable that they don't.
If two files that are supposed to be linked together include a header that has definitions, there's a chance the linker will produce a duplicate definition error. I can't at this time remember the exact conditions that are required for this to happen.
There are, however, times when it's necessary to put the definition in the header. This is the case with template functions.
Inline functions are defined within a header. There is nothing wrong with that. To avoid duplicate definition linker errors you simply surround the contents of the headers with some kind of guard mechanism to prevent that.
Header files are used to declare symbols which are compiled separately so you can use them. That's why you don't have function bodies in the header (except in cases already mentioned)