Найти в Дзене

Перегрузка функций в С++

С++, как и многие другие языки, позволяет давать разным функциям одинаковые имена. Но с определёнными оговорками. Например, вот так делать нельзя:

int myFunc() {};
int myFunc() {};

Здесь мы объявили две функции с одинаковыми именами, и компилятор выдаст ошибку.

Но как же высказанное выше утверждение? Ну да, я немного слукавил. В одной области видимости всё-таки не должно быть функций с одинаковыми именами. Но, дело в том, что здесь имеется ввиду полное имя функции, которое содержит не только идентификатор, но также и количество и тип возвращаемых значений. Поэтому вот эти функции С++ будет считать разными, а компилятор не выдаст ошибок:

Возможность называть несколько функций одним и тем же именем называется перегрузкой функций. Если всё сделано правильно, так как на рисунке выше, то компилятор может отличить одну функцию от другой, несмотря на то, что у них одинаковые имена. Потому что тип и количество аргументов у них разные. И, как вы заметили, вызов этих функций в программе тоже имеет разный вид. Поэтому и компилятор сможет их отличить, и, в зависимости от набора аргументов, вызвать правильную функцию в нужном месте.

Также обратите внимание, что в полное имя функции не входит возвращаемый результат и имена аргументов. Поэтому вот эти функции считаются одинаковыми, и компилятор выдаст ошибку:

//Ошибка - функции одинаковые, так как
//отличаются только именами аргументов
int myFunc(int x) {};
int myFunc(int y) {};
//Ошибка - функции одинаковые, так как
//отличаются только типом возвращаемого значения
int myFunc(int x) {};
double myFunc(int x) {};

Если с именами аргументов всё понятно, то почему нельзя использовать тип возвращаемого значения для идентификации функции?

Допустим, у нас есть такой код:

int myFunc(int x) {};
double z = myFunc(1);

Здесь нет никакого криминала. Мы просто объявляем переменную z типа double, и несмотря на то, что функция возвращает int, ничего страшного не произойдет. Просто результат будет неявно преобразован в double. Но компилятор может однозначно понять, какую функцию ему вызывать.

А если у нас будет две таких функции:

int myFunc(int x) {};
double myFunc(int x) {};

то как быть компилятору в этом случае:

double z = myFunc(1);

Что ему делать? Вызывать функцию, которая возвращает double, или вызывать первую функцию и преобразовывать результат в double? Ситуация неоднозначная, компилятор сделать выбор не сможет. Поэтому функции, которые отличаются только типом возвращаемого значения, не могут быть перегруженными, и если компилятор находит такие функции, то он выдаёт ошибку.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.

Наука
7 млн интересуются