Several good "answers" already, but I would say that the a major reason for separating the declaration and the implementation is that you don't [hopefully, if you thought your design through, etc] change the declaration very often during development, but you do, quite regularly change, the implementation during the development.
The benefit then is that you only need to actually compile the implementation file of that particular class, rather than "every file that includes the interface declaration in the header".
Of course, this has to be tempered by the fact that you can't inline functions.
For tiny to small projects, it makes little difference. For larger projects, it does make a difference. For example, if I modify the "parser.cpp" for my Pascal compiler, it takes 26 seconds to build the new compiler. If I modify a header file that causes "everything" to be rebuilt, it takes 1m28s to build. This project only has 10 source files (because I use llvm for the backend part). Imagine a project with 60 source files.