Хелпикс

Главная

Контакты

Случайная статья





Позднее связывание.



Позднее связывание.

В некоторых программах невозможно знать наперёд, какая функция будет вызываться первой. В таком случае используется позднее связывание (или ещё «динамическая привязка»). В C++ для выполнения позднего связывания используются указатели на функции. Функция, на которую указывает указатель, может быть вызвана через указатель и оператор вызова функции.

Вызов функции через указатель на функцию также известен как непрямой (или ещё «косвенный») вызов функции.

#include <iostream>

 

int add(int a, int b)

{

return a + b;

}

int subtract(int a, int b)

{

return a - b;

}

int multiply(int a, int b)

{

return a * b;

}

int main()

{

int a;

std::cout << "Enter a number: ";

std::cin >> a;

 

int b;

std::cout << "Enter another number: ";

std::cin >> b;

 

int op;

do

{

   std::cout << "Enter an operation (0 = add, 1 = subtract, 2 = multiply): ";

   std::cin >> op;

} while (op < 0 || op > 2);

// Создаём нулевой указатель на функцию с именем fnct

int (*fnct)(int, int) = nullptr;

 

// Указываем fnct указывать на функцию, которую выберет пользователь

switch (op)

{

   case 0: fnct = add; break;

   case 1: fnct = subtract; break;

   case 2: fnct = multiply; break;

}

// Вызываем функцию, на которую указывает fnct с параметрами a и b

// Используется позднее связывание

std::cout << "The answer is: " << fnct (a, b) << std::endl;

return 0;

}

Здесь мы указываем fnct указывать на функцию, которую выберет пользователь. Затем мы вызываем через указатель функцию, которую выбрал пользователь. Компилятор не может использовать раннее связывание для выполнения вызова функции fnct (a, b), так как он не может наперёд определить, на какую функцию fnct будет указывать!

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

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.