Перегрузка функций может происходить между двумя функциями-членами, которые имеют одинаковое количество параметров, если одна из них объявлена как const.
Но что, если одна функция имеет аргумент const, а другая — неконстантный аргумент того же типа?
Будет ли это работать для ссылок и указателей? Если C ++ предоставляет это, почему это обеспечивает? Пожалуйста, поделитесь причиной со мной, если вы знаете.
Ниже приведен пример, который поможет вам понять вышеприведенный сценарий.
void fun(const int i)
{
cout << "fun(const int) called ";
}
void fun(int i)
{
cout << "fun(int ) called " ;
}
int main()
{
const int i = 10;
fun(i);
return 0;
}
Вывод: ошибка компилятора: redefinition of 'void fun(int)'
void fun(char *a)
{
cout<<"non-const fun() called";
}
void fun(const char *a)
{
cout<<"const fun() called";
}
int main()
{
const char *ptr = "GeeksforGeeks";
fun(ptr);
return 0;
}
Вывод: const fun () называется
Почему второй разрешен в C ++?
Параметры первого верхний уровень const
, Это означает, что функция не может изменить значение параметра, однако вызывающему не все равно: вызываемый получает копия аргумента, так что если параметр имеет верхний уровень const
Это деталь реализации. Обратите внимание, что следующие работы:
void f(int); // forward declare
void g(){ f(42); }
void f(int const i){ /*...*/ } // define above declared function
Для второго набора перегрузок const
больше не на высшем уровне. Описывает, может ли вызываемый измениться на что указывает указатель. Как звонящий, ты делать заботиться об этом. Это больше не просто детали реализации.
Сначала объясните, почему первый код не разрешен, а второй исправен.
const int
а также int
в качестве параметра вы передаете любой связанный тип, double
, int
или что-нибудь еще может преобразовать в int, оба const int
а также int
может принять передаваемое значение, разницы практически нет. И если компилятор позволяет определить оба, то какой из них вызывать? Вы не знаете, ни компилятор. Поэтому первая часть кода не допускается.
Когда дело доходит до второго примера, ссылка и указатель имеют значение. Потому что вы не можете передать const int*
инициализировать int *
и ни один не может использовать const int
инициализировать int&
, Таким образом, если вы определяете две функции с одинаковым типом возвращаемого значения, одна из них является «const version» указатель или же ссылка параметр, а другой нет, это имеет значение. Возникает еще один вопрос, что если я передам int
объект(или называется переменной, то же значение) или int *
указатель, то какой из них соответствует (когда параметры указатель или же ссылка)? Ответ «неконстантный». если вы хотите сопоставить «константную версию» с неконстантным объектом или не указателем на константный указатель, вам может потребоваться const_cast
который я пытаюсь выяснить.
Итак, вернемся к вашему вопросу:
Но что, если одна функция имеет аргумент const, а другая — неконстантный аргумент того же типа? Будет ли это работать для ссылок и указателей?
Да, это в какой-то степени работает только для справки и указателей.
А также
Если C ++ предоставляет это, почему это обеспечивает?
Не могу сказать. У меня нет большого опыта.
Для получения дополнительной информации, прочитайте разделы очень связанных частей C ++ Primer 5th.
Ссылки на скриншоты перечислены ниже:
Кстати, хотя я новичок. Но что это int const i
с первого ответа? И я не понимаю, что «это деталь реализации«точно имею в виду. без обид, просто не могу понять эту часть ответа.: D