As mentioned, destructors are for freeing resources when an object is being deleted. If the object only uses non-dynamically assigned resources, the destructor will do nothing (this is also the default if you don't explicitly code one). If you do use dynamic allocation for any member data, those need to be freed in the destructor or eles you'll have memory leaks - the default doesn't work here.
As to why it uses the ~, well, I guess that was the decision of the guy who wrote C++. My guess is that the ~ (two's complement) of the constuctor is the destructor, but that's just what my tired brain is making up... :p