Программирование >>  Расширенная версия языка c++ 

1 ... 51 52 53 [ 54 ] 55 56 57 ... 227


Неоднозначность, основанная на аргументах по умолчанию и перегрузке функций tinclude <iostream>

using namespace std; . : .

in f (int a) i

return a

int f{int a, int b 0) (

return a * b;

int mainO

cou f(10, 2); вызывается nt, int)

cou f(10); неоднозначность, . .

что вызвать dnt, int) или ffint)???

return 0;

Здесь вызов функции Д10, 2) совершенно правилен и не ведет к неоднозначности. Однако у компилятора нет способа выяснить, какую версию функции f() вызывает версия f(10) - первую или вторую, в которой параметр и передается по умолчанию.

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

мах.

5.6. Определение адреса перегруженной функции

В заключение этой главы вы узнаете, как найти адрес перегруженной функции. Так же, как и в С, вы можете присвоить адрес функции указателю и получить доступ к функции через этот указатель. Адрес функции можно найти, если поместить имя функции в правой части инструкции присваивания без всяких скобок или аргументов. Например, если zap() - это функ-



Здесь представлена программа, которая содержит две версии функции space(). Первая версия выводит на экран некоторое число пробелов, заданное в переменной count. Вторая версия выводит на экран некоторое число каких-то иных символов, вид которых задан в переменной ch. В функции main() объявляются оба указателя на эти функции. Первый задается как указатель на функцию, имеющую только один целый параметр. Второй объявляется как указатель на функцию, имеющую два параметра.

/* Иллюстрации ивания и получение телей на перегруженные функции

linclude <iostreain> using namespace std;

ывод заданного в переменной count числа пробелов voi e(int count) {

for(; count; coun --) cout ; } , -

ывод заданного в переменной count числа стволов, / / вид которых задан в переменной ch voi e(int count, char ch)

count; count cout ch;

ция, причем правильно объявленная, то корректным способом присвоить

переменной р адрес функции zap() является инструкция:

р - zap;

В языке С любой тип указателя может использоваться как указатель на поскольку имеется только одна на которую он может

ссылаться. Однако в С++ ситуация несколько более сложная, поскольку функция может быть перегружена. Таким образом, должен быть некий механизм, который позволял бы определять адреса перегруженных версий

функции.

Решение оказывается не только элегантным, но и эффектным. Способ объявления указателя и определяет то, адрес какой из перегруженных версий функции будет получен. Уточним, объявления указателей соответствуют объявлениям перегруженных функций. Функция, объявлению которой соответствует объявление указателя, и является искомой функцией.



intmain С) .j-Mm ,

f ..! , *...:

/* Создание указателя на функцию с одн1м цельм параметром. */ void (*fpl)(int);

SHHf указателя на функцию с одним цел и одн символьным параметром. */ void аии, c)iar};

fpl = space; получение адреса функции space (int)

fp2 space; получение адреса функции char)

fp 2); выводит 22 пробела

cout \n ; w

fp2(30, x); выводит 3 0 стволов х \

cout I\n ; . . .

return 0; . .. .

Как показано в комментариях, на основе того, каким образом объявляются указатели fpl и fp2, компилятор способен определить, какой из них на какую из перегруженных функций будет ссылаться.

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

У1)ра)кнения

1. Ниже приведены две перегруженные функции. Покажите, как получить адрес каждой из них.

in (int a, int b)

return a - b;

floa (float a, float b)

return a - b;



1 ... 51 52 53 [ 54 ] 55 56 57 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика