What are benefits of using these operators instead of implicit casting in c++? 

```
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression) 

```

Why, where, in which situation we should use them? And is it true that they are rarely used in OOP?