Это вытекает из требования языка и компилятора, вы можете написать функцию внутри класса:
void PrintClassName(const ClassName& cl) {
cout << cl.Get() << endl;
}
Казалось бы, код занимаются только печатью, принимает параметр по константной ссылке, но при запуске кода вылезет ошибка, и это потому что нигде в методе PrintClassName не указано явно, что он не меняет объект. Компилятор не дает вызвать те методы, для которых не указано явно, что объект они не меняют, достаточно переписать код так:
void PrintClassName(const ClassName& cl) const {
cout << cl.Get() << endl;
}
И все заработает.
Или же мы можем рассмотреть другой вариант, и подставить в какую-нибудь функцию на это место ключевое слово volatile, которое говорит, что значение может меняться из вне.
По сути, все, что можно поставить на место MYPARAM является указателем для компилятора, которое побуждает или наоборот не побуждает его к каким-либо действиям.