КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Перегрузка функций
Функции с переменным числом параметров В СИ++ допустимы функции, у которых при компиляции не фиксируется число параметров, и, кроме того может быть неизвестен тип этих параметров. Количество и тип параметров становится известным только в момент вызова, когда явно задан список фактических параметров. Каждая функция с переменным числом параметров должна иметь хотя бы один обязательный параметр. Определение функции с переменным числом параметров: тип имя (явные параметры,...) {тело функции } После списка обязательных параметров ставится запятая, а затем многоточие, которое показывает, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции производить не нужно. Сложность заключается в определении начала и конца списка параметров, поэтому каждая функция с переменным числом параметров должна иметь механизм определения количества и типов параметров. Существует два подхода: 1) известно количество параметров, которое передается как обязательный параметр; 2) известен признак конца списка параметров; Пример1 Найти среднее арифметическое последовательности чисел //известен признак конца списка параметров #include<iostream.h> float sum(int k,...) { int *p=&k;//настроили указатель на параметр k int s=0; for(;k!=0;k--) s+=*(++p); return s/k; } void main() { cout<<”\n4+6=”<<sum(2,4,6);//находит среднее арифметическое 4+6 cout<<”\n1+2++3+4=”<<sum(4,1,2,3,4);//находит среднее арифметическое 1+2+3+4 } Для доступа к списку параметров используется указатель *p типа int. Он устанавливается на начало списка параметров в памяти, а затем перемещается по адресам фактических параметров (++p). Пример 2. //известен признак конца списка параметров #include<iostream.h> int sum(int k,...) { int *p=&k;//настроили указатель на параметр k int s=*p;//значение первого параметра присвоили s for(int i=1;p!=0;i++)//пока нет конца списка s+=*(++p); return s/(i-1); } void main() { cout<<”\n4+6=”<<sum(4,6,0);//находит среднее арифметическое 4+6 cout<<”\n1+2++3+4=”<<sum(1,2,3,4,0);//находит среднее арифметическое 1+2+3+4 }
Цель перегрузки состоит в том, чтобы функция с одним именем по-разному выполнялась и возвращала разные значения при обращении к ней с различными типами и различным числом фактических параметров. Для обеспечения перегрузки необходимо для каждой перегруженной функции определить возвращаемые значения и передаваемые параметры так, чтобы каждая перегруженная функция отличалась от другой функции с тем же именем. Компилятор определяет какую функцию выбрать по типу фактических параметров. Пример. #include<iostream.h> #include <string.h> int max(int a,int b) { if(a>b)return a; else return b; } float max(float a,float b) { if(a>b)return a; else return b; } char*max(char*a,char*b) { if(strcmp(a,b)>0) return a; else return b; } void main() { int a1,b1; float a2, b2; char s1[20]; char s2[20]; cout<<"\nfor int:\n"; cout<<"a=?";cin>>a1; cout<<"b=?";cin>>b1; cout<<"\nMAX="<<max(a1,b1)<<"\n"; cout<<"\nfor float:\n"; cout<<"a=?";cin>>a2; cout<<"b=?";cin>>b2; cout<<"\nMAX="<<max(a2,b2)<<"\n"; cout<<"\nfor char*:\n"; cout<<"a=?";cin>>s1; cout<<"b=?";cin>>s2; cout<<"\nMAX="<<max(s1,s2)<<"\n"; } Правила описания перегруженных функций: 1) Перегруженные функции должны находиться в одной области видимости. 2) Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В разных вариантах перегруженных функций может быть разное количество умалчиваемых параметров. 3) Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или наличием ссылки. Например, функции int&f1(int&,const int&){... } и int f1(int,int){... } – не являются перегруженными, т. к. компилятор не сможет узнать какая из функций вызывается: нет синтаксических отличий между вызовом функции, которая передает параметр по значению и функции, которая передает параметр по ссылке.
Дата добавления: 2014-01-04; Просмотров: 396; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |