Operator overloading is used to make it easier to read/use an object. For example, you can overload the operator << so that you can print the value associated with an object rather than using an accessor function.

Operator overloading also allows you to assign one object to another via the operator =. This ensures that everything is copied correctly from one object to another.

Templates, I'm just starting on them, but they are used when you want to make a container (or object) like a vector which can handle any type (int, double, string, whatever).

Templates and operator overloading are just tools like everything else in C++ - Use them when they're appropriate. If you understand what they're capable of, you'll be able to recognise for yourself where and when they might be useful; but if you'd like some specific examples, then look no further than the STL

>I am learning the OOP recently and i have a few questions to ask
I wouldn't list operator overloading or templates as features of OOP. In fact, templates are how C++ supports a somewhat different paradigm from OOP: generic programming.

>1) When should i use operator overloading?
>2) When should i use template?
Bench already mentioned this, but I'll emphasize it. If you have to ask this question, you probably don't understand the feature well enough to use it properly in real code. If you do understand the feature well enough to use it, you'll also know intuitively when it should be used.

And of course, moderation is key. I've seen horrible messes where the programmer thought operator overloading was cool and used it too much. Template metaprogramming is a fantastic example of templates gone wrong. Is it cool? Absolutely. Is it occasionally useful? Sure. Is it an everyday thing? Hell no.