Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / Лекция 9.doc
Скачиваний:
101
Добавлен:
02.04.2015
Размер:
110.59 Кб
Скачать

Массив указателей на функцию (jump table)

void f1( );

void f2( ); //прототипы функций

void f3( );

void f1( )

{

cout<<"1"<<endl;

}

void f2( )

{

cout<<"2"<<endl;

}

void f3( )

{

cout<<"3"<<endl;

}

void (*jt[])( )={f1,f2,f3};// массив указателей на функции с

// инициализацией

int main( )

{

for (int i=0;i<3;i++) jt[i]( ); // вызов функций в цикле через элемент

//массива

//for (int i=0;i<3;i++) (*jt)[i]( );// или так

getch();

return 0;

}

В общем виде массив указателей на функции :

тип (*ptrf[])(список параметров, идентичный списку параметров

функций)

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

  • Перегрузка функций (function overloading) – использование нескольких функций с одним и тем же именем, но с различными типами параметров или их количеством

  • В С не поддерживается перегрузка функций

void f(int i); // передается один целочисленный параметр

void f(int i, int j); // передаются два целочисленных параметра

void f(double v); // передается один действительный параметр

int main()

{

f(10); // вызов первой функции

f(10, 20); // вызов второй функции

f(12.23); // вызов третьей функции

return 0;

}

void f(int i)

{

cout << "I=" << i << '\n';

}

void f(int i, int j)

{

cout << "I=" << i;

cout << ", J=" << j << '\n';

}

void f(double v)

{

cout << "V=" << v<< '\n';

}

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

Однако, лучше определять перегруженные функции с одинаковым набором действий, но с различными типами параметров

Аргументы функции, передаваемые по умолчанию

  • Аргумент, передаваемый по умолчанию, представляет собой значение, которое будет автоматически передано параметру функции в случае, если аргумент, соответствующий этому параметру, явным образом не задан

  • Значения по умолчанию должны быть заданы только один раз при первом объявлении функции в файле

  • Все аргументы, принимающие значения по умолчанию, должны быть расположены справа от всех остальных

void myfunc(float num = 0.0, char ch = 'X')

{

. . .

}

Myfunc(15.1, 'a'); // передача явно заданных значений

myfunc(10.1); // передача одного явно заданного параметра (num), //второй- передается по умолчанию

myfunc(); // оба параметра передаются по умолчанию

Шаблоны функций

  • Перегруженные функции используются для выполнения сходных операций над различными типами данных

  • Если операции идентичны для каждого типа, то используются шаблоны

Общий формат

template <class T> тип имя_функции(список параметров)

{

//тело функции

}

Пример

template <class T> // или template <typename T>

T min(T x1, T x2, T x3)

{

T lmin=x1;

if (x2<lmin) lmin=x2;

if (x3<lmin) lmin=x3;

return lmin;

}

int main(int argc, char* argv[])

{

int i1=1,i2=3,i3=2;

double r1=2.5,r2=1.7,r3=3.4;

cout<<min(i1,i2,i3)<<endl;

cout<<min(r1,r2,r3)<<endl;

getch();

return 0;

}

Возврат ссылок

Функция может возвращать ссылку

double val=100.0;

double &f()

{

return val; // возвращение ссылки на val

}

int main()

{

double newval;

cout<<f( )<<endl; // отображение значения val=100

newval=f( ); // присвоение значения val=100;

cout<<newval<<endl;

f( )=50.5; //изменение val=50.5

cout<<f()<<endl; // отображение значения val=50.5

}

Быстрый вызов функций

В среде С++Builder используется быстрый вызов функций и для этого используется атрибут __fastcall

тип возвращаемого значения __fastcall имя_функции (список аргументов)

Компилятор строит код, в котором значения аргументов размещаются не в стеке, а на регистрах процессора, если последние свободны. Это ускоряет выполнение программы