Basically, it is because C++ is a statically typed language. That is, all types are fixed at compile-time, none resolved at run-time. (Some features, like
virtual functions, somewhat weaken this principle, but do not invalidate it.)
In order to accept any identifier, be it a type, constant, variable, function, whatnot, the compiler needs to know the exact type of that identifier. That type is introduced by a declaration. The compiler uses this to check whether the identifier is used appropriately according to its type. This prevents you from incrementing a floating point variable, changing a constant, invoking a member function on an object of a class that doesn't have that member function, and call a function with the wrong number and type of arguments.
Later, the linker will link all references to a certain identifier to the definition of it. (So it has to be defined somewhere, and it has to be defined exactly once.) Now, every definition can be used in place of a declaration, so you could get away without declaring anything at all, if you defined everything before its use.
However, this does have serious drawbacks, the most obvious ones being that it would abandon separate compilation and leaves you no way to define two or more identifiers that reference each other.