Хотя перегрузка функций позволяет избежать необходимости создавать и запоминать имена общепринятых операций, она не всегда целесообразна. В некоторых случаях разные имена функций предоставляют дополнительную информацию, которая упрощает понимание программы. Давайте рассмотрим набор функций-членов класса Screen
, отвечающих за перемещение курсора.
Screen& moveHome();
Screen& moveAbs(int, int);
Screen& moveRel(int, int, string direction);
На первый взгляд может показаться, что этот набор функций имеет смысл перегрузить под именем move
:
Screen& move();
Screen& move(int, int);
Screen& move(int, int, string direction);
Однако при перегрузке этих функций мы потеряли информацию, которая была унаследована именами функции. Хотя перемещение курсора — это общая операция, совместно используемая всеми этими функциями, специфический характер перемещения уникален для каждой из этих функций. Рассмотрим, например, функцию moveHome()
, осуществляющую вполне определенное перемещение курсора. Какое из двух приведенных ниже обращений понятнее при чтении кода?
//
myScreen.moveHome(); //
myScreen.move();
const_cast
и перегрузкаВ разделе 4.11.3 упоминалось, что оператор const_cast
особенно полезен в контексте перегруженных функций. В качестве примера вернемся к функции shorterString()
из раздела 6.3.2:
// возвратить ссылку на строку, которая короче
const string &shorterString (const string &s1, const string &s2) {
return s1.size() <= s2.size() ? s1 : s2;
}
Эта функция получает и возвращает ссылки на константную строку. Мы можем вызвать функцию с двумя неконстантными строковыми аргументами, но как результат получим ссылку на константную строку. Могла бы понадобиться версия функции shorterString()
, которая, получив неконстантные аргументы, возвратит обычную ссылку. Мы можем написать эту версию функции, используя оператор const_cast
:
string &shorterString(string &s1, string &s2) {
auto &r = shorterString(const_cast
const_cast
return const_cast
}
Эта версия вызывает константную версию функции shorterString()
при приведении типов ее аргументов к ссылкам на константу. Функция возвращает ссылку на тип const string
, которая, как известно, привязана к одному из исходных, неконстантных аргументов. Следовательно, приведение этой строки назад к обычной ссылке string&
при возвращении вполне безопасно.
Когда набор перегруженных функций определен, необходима возможность вызвать их с соответствующими аргументами.