C++ don’t have event system out of the box, at most you got normal function calls which you know that will be called on specific occasion. The weakness of this set up is fact that you can’t detect events in code outside of the object it self, or else called of event sends it also somewhere else, external object can’t get call then other object is destroyed for example. Thats why delegates was made which work like variable and other object (or even object less static function) can register it to the event to receive the call when it occurs.
DECLERE_DELEGATE is declaring delegate type, and by making varable out of it you make point to which everything can subscribe to the event. The multicast allows for multiple functions and object to subscribe to delegate, the normal one does not allow that if you set new function the old one is replaced (do it kind of work like a pointer to function of a object).
Delegates are not messaging system which by your description you seem to expect to be… it’s not system to begin with, it just variable type that can gather function and object pointers and call them out on broadcast call, they require exposure as otherwise nothing can register to delegate.
UE4 have messaging bus system, but i really don’t see it being use widely (atleats in games and there no blueprint exposure at all) and i didn’t use it yet myself, the API reference related to has probably biggest intro documentation i know in API refrence, so read it up if you interested