To avoid undesirable changes to an argument passed by reference, you pass it as a const parameter. For example:
void f(const string & s); // f can't change s
However, some programmers use const even when they pass parameters by value, for example:
void f(const int n); // n is passed by value, why const?
Is it really necessary? No, it's not. Remember that when you pass a parameter by value, the function called can't make changes to original value anyway because it receives a copy of it. Therefore, the use of const for passing parameters by value only blocks the function from changing its local copy. However, whether a function changes its local copy of some variable is an implementation detail; it's not a part of the interface. Therefore, users of this function don't (and shouldn't) need to know that. As a rule, don't declare parameters const if they are passed or returned by value.