<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:cpplang</id>
  <title>C-lang</title>
  <subtitle>C/C++ STL</subtitle>
  <author>
    <name>cpplang</name>
  </author>
  <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom"/>
  <updated>2008-01-17T13:37:03Z</updated>
  <lj:journal username="cpplang" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://cpplang.livejournal.com/data/atom" title="C-lang"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:2615</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/2615.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=2615"/>
    <title>cpplang @ 2008-01-17T16:12:00</title>
    <published>2008-01-17T13:37:03Z</published>
    <updated>2008-01-17T13:37:03Z</updated>
    <content type="html">&lt;pre&gt;В одном тесте по C++ наткнулся на два таких вот вопроса:&lt;br /&gt;	Какие операторы разрешается перегружать только как фунции-члены класса?&lt;br /&gt;	Какие операторы не рекомендуется перегружать как фунции-члены класса?&lt;br /&gt;С первым вопросом всё ясно - открываем Стандарт и смотрим. &lt;br /&gt;А вот ответ на второй носит скорее рекомендательный характер нежели руководство к действию.&lt;br /&gt;В результате поиска ответов познакомился с некоторыми любопытными рекомендациями, которые&lt;br /&gt;и привожу ниже.&lt;br /&gt;&lt;br /&gt;Интересно было бы получить на этот счёт ваши возражения, замечания, дополнения.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;  Правила&lt;br /&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;    Бинарный оператор можно определить либо в виде нестатической функции-члена с одним аргументом, &lt;br /&gt;    либо функции-не-члена с двумя аргументами.&lt;br /&gt;    Унарный оператор можно определить либо в виде нестатической функции-члена без аргументов,&lt;br /&gt;    либо функции-не-члена с одним аргументом.&lt;br /&gt;&lt;br /&gt;  Ответы&lt;br /&gt;    Какие операторы разрешается перегружать только как фунции-члены класса?&lt;br /&gt;      Операторы operator=, operator[], operator(), operator-&amp;gt; могут быть только нестатическими функциями-членами.&lt;br /&gt;    Какие операторы не рекомендуется перегружать как фунции-члены класса?&lt;br /&gt;      Операции, в которых преобразование типов должно быть применено ко всем параметрам (операции смешанной арифметики),&lt;br /&gt;      не рекомендуется перегружать как фунции-члены класса.&lt;br /&gt;&lt;br /&gt;  Замечания&lt;br /&gt;    Операторная функция, у которой первый операнд принадлежит к встроеному типу, не может являться членом класса.&lt;br /&gt;    Запрещена перегрузка оператора функцией, которая в качестве входных параметров принимает значения только встроеных типов &lt;br /&gt;    (в Стандарте говорится:"Операторная функция ... должна содержать по крайней мере один параметр, &lt;br /&gt;    тип которого - класс, ссылка на класс, перечисление или ссылка на перечисление."). &lt;br /&gt;&lt;br /&gt;  Рекомендации&lt;br /&gt;    Целесообразно определять в классе бинарные операторы, модифицирующие значение первого аргумента, например, +=, *=.&lt;br /&gt;      Операторы ||, &amp;amp;&amp;amp; и ,&lt;br /&gt;	Не рекомендуется перегружать операторы &amp;amp;&amp;amp;, ||, поскольку оптимизированная семантика (при которой вычисление выражения заканчивается, &lt;br /&gt;        как только установлена его истинность или ложность) заменяется на семантику вызовов функций.&lt;br /&gt;	Такая замена приводит к следующему:&lt;br /&gt; 	  - во-первых, вычисляются все аргументы, что уже само по себе не оптимально,&lt;br /&gt; 	  - во-вторых, Стандартом не определяется порядок вычисления аргументов функции;&lt;br /&gt;             это может повлечь за собой ошибки и, в любом случае, противоречит логике оптимизированной семантики.&lt;br /&gt;	По этой же причине не рекомендуется перегружать оператор ',' для которого сначала производится оценка выражения,&lt;br /&gt;        стоящего справа, а затем выражения, стоящего слева.&lt;/b&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:2490</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/2490.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=2490"/>
    <title>И снова ЗДРАВСТВУЙТЕ</title>
    <published>2008-01-08T22:04:40Z</published>
    <updated>2008-01-08T22:04:40Z</updated>
    <content type="html">Эх, как быстро заканчивается всё хорошее. Вот и снова пора на работу. &lt;br /&gt;Для раскачки занялся своим сайтом - давно хотел сделать, да вот руки как-то всё не доходили. Одним словом, теперь для каждой статьи, чьё содержимое может быть оспорено, будет создан раздел 'Замечания'. Для статьи 'Указатели на Функции' уже начал публиковать замечания, между прочим по мотивам тех, что были сделаны членами сообществ программистов на LiveJournal. &lt;br /&gt;&lt;br /&gt;P.S. Лучше всего пересылать замечания на почту на clang@list.ru.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:2241</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/2241.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=2241"/>
    <title>С наступающим Новым годом!</title>
    <published>2007-12-26T20:16:05Z</published>
    <updated>2007-12-26T20:32:11Z</updated>
    <content type="html">&lt;lj-embed id="3" /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:1981</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/1981.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=1981"/>
    <title>Тематические задачи по C++ и STL</title>
    <published>2007-12-12T18:36:44Z</published>
    <updated>2007-12-12T18:41:07Z</updated>
    <content type="html">Мои коллеги по работе создали &lt;a href="http://ysoft.ru"&gt;форум&lt;/a&gt;, на котором будут выкладываться и обсуждаться задачи по C++.&lt;br /&gt;Охватываемые вопросы - пока что шаблоны, наследование и виртуальность, т.е. основной упор делается на полиморфизм.&lt;br /&gt;Собственно, это направление и является основным на собеседованиях. Так что такой форум несомненно штука полезная.&lt;br /&gt;&lt;br /&gt;Может быть и я чего-нибудь там выложу, кто его знает.:-)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(адрес форума: &lt;a href="http://ysoft.ru"&gt;http://ysoft.ru&lt;/a&gt; )&lt;/i&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:1711</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/1711.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=1711"/>
    <title>cpplang @ 2007-12-07T23:58:00</title>
    <published>2007-12-07T21:12:33Z</published>
    <updated>2007-12-07T21:15:16Z</updated>
    <content type="html">Вот попались такие задачки-5-минутки.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Задачка 1.&lt;/b&gt;&lt;br /&gt;В приведенном ниже коде требуется найти 3 способа заставить программу печатать 20 звездочек, изменив 1 символ. Примечание: изменить - это добавить, изменить, удалить.&lt;br /&gt;&lt;br /&gt;&lt;font color="#339966"&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/font&gt;&lt;br /&gt;&lt;font color="#3366ff"&gt;&lt;font color="#ffcc99"&gt;int&lt;/font&gt; &lt;/font&gt;main()&lt;br /&gt;{&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#3366ff"&gt;&lt;font color="#ffcc99"&gt;int&lt;/font&gt; &lt;/font&gt;i, N=20;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;for&lt;/b&gt; (i=0; i&amp;lt;N; i--)&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;printf&lt;/b&gt;(&lt;font color="#ff6600"&gt;"*"&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;return&lt;/b&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Задачка 2.&lt;br /&gt;&lt;/b&gt;Что отобразится на экране&lt;br /&gt;&lt;font color="#339966"&gt;#include&amp;lt;iostream&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffcc99"&gt;char&lt;/font&gt; a[40]={};&lt;br /&gt;&lt;font color="#ffcc99"&gt;char&lt;/font&gt;* p1=a[0];&lt;br /&gt;&lt;font color="#ffcc99"&gt;char&lt;/font&gt;* p2=a[20];&lt;br /&gt;&lt;font color="#ffcc99"&gt;int&lt;/font&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;(int*)p2-(int*)p1&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;return&lt;/b&gt; 0;&amp;nbsp; &lt;br /&gt;}</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:1404</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/1404.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=1404"/>
    <title>Заметки о C++</title>
    <published>2007-12-05T22:54:59Z</published>
    <updated>2007-12-05T22:58:40Z</updated>
    <content type="html">На моём сайте, &lt;a href="http://cpplang.narod.ru"&gt;C-lang&lt;/a&gt;, появился новый раздел "Заметки о C  ". Здесь будут публиковаться переводы драфтов и прочего, например, не имеющего авторства.&lt;br /&gt;&lt;br /&gt;P.S. Труд Ларса Хенделя подвергся вполне заслуженной критике со стороны коллег-разработчиков, - действительно много ошибок и неточностей. Надо будет не забыть перепроверить содержимое статьи.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:1260</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/1260.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=1260"/>
    <title>Lars Haendel. The Function Pointer Tutorials.</title>
    <published>2007-12-03T08:42:10Z</published>
    <updated>2007-12-03T08:58:30Z</updated>
    <content type="html">Закончен перевод руководства Ларса Хенделя. &lt;br /&gt;Выложил на &lt;a href="http://cpplang.narod.ru" target="clang"&gt;C-lang&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:982</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/982.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=982"/>
    <title>ГОСТы для разработчиков программного обеспечения</title>
    <published>2007-11-25T21:42:35Z</published>
    <updated>2007-11-25T21:42:35Z</updated>
    <content type="html">&lt;a href="http://ysoft.ru/main/ShowId=1029_x_2.html"&gt;Скачать можно тут&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cpplang:758</id>
    <link rel="alternate" type="text/html" href="http://cpplang.livejournal.com/758.html"/>
    <link rel="self" type="text/xml" href="http://cpplang.livejournal.com/data/atom/?itemid=758"/>
    <title>Introduction</title>
    <published>2007-11-25T00:08:48Z</published>
    <updated>2007-11-25T01:18:03Z</updated>
    <content type="html">Просматривая блог Алёны Сагалаевой (&lt;a href="http://alenacpp.blogspot.com"&gt;http://alenacpp.blogspot.com&lt;/a&gt;) обнаружил ссылку на ресурс, посвященный указателям на функцию и обратным вызовам &lt;a href="http://www.newty.de/fpt/index.html"&gt;http://www.newty.de/fpt/index.html&lt;/a&gt;. &lt;br /&gt;На мой взгляд Ларс Хендель составил замечательное руководство по работе с указателями на функции. &lt;br /&gt;В ближайшее время закончу перевод, а пока что содержание и первый раздел:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;1.&amp;nbsp; Введение в Указатели на Функции&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1.1&amp;nbsp; Что такое "Указатель на Функцию"?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1.2&amp;nbsp; Вводный Пример или "Как Заменить Оператор Switch" &lt;br /&gt;&amp;nbsp;2.&amp;nbsp; Синтаксис Указателей на Функции в C и C++&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.1&amp;nbsp; Определение Указателя на Функцию &lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.2&amp;nbsp; Соглашение о Вызовах&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.3&amp;nbsp; Присвоение Адреса Указателю на Функцию(Assign an Address to a Function Pointer)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.4&amp;nbsp; Сравнение Указателей на Функции&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.5&amp;nbsp; Вызов Функции через Указатель на Функцию&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.6&amp;nbsp; Как передать Указатель на Функцию в качестве Аргумента?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.7&amp;nbsp; Как Вернуть Указатель на Функцию?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2.8&amp;nbsp; Как Использовать Массивы Указателей на Функции?&lt;br /&gt;&amp;nbsp;3.&amp;nbsp; Как Осуществить Обратные Вызовы в C и C++?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.1&amp;nbsp; Введение в Концепцию Функций Обратных Вызовов&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.2&amp;nbsp; Как Выполнить Обратный Вызов в C?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.3&amp;nbsp; Код примера использования qsort&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.4&amp;nbsp; Как Осуществить Обратный Вызов в Статической Функции-Члене?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3.5&amp;nbsp; Как Осуществить Обратный Вызов в Нестатической Функции-Члене?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Пример А: Указатель, инстанцированный в классе, передается в качестве дополнительного параметра&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Пример Б: Указатель, инстанцированный в классе, хранится в глобальной переменной&lt;br /&gt;&amp;nbsp;4.&amp;nbsp; Функторы для инкапсуляции Указателей на Функции в C и C++&lt;br /&gt;&amp;nbsp;&amp;nbsp; 4.1&amp;nbsp; Что такое Функторы?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 4.2&amp;nbsp; Как Имплементировать Функторы?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 4.3&amp;nbsp; Пример Использования Функторов&lt;br /&gt;&amp;nbsp;5.&amp;nbsp; Специальные Ссылки&lt;br /&gt;&amp;nbsp;&amp;nbsp; 5.1&amp;nbsp; Введения в Указатели на Функции&lt;br /&gt;&amp;nbsp;&amp;nbsp; 5.2&amp;nbsp; Обратные Вызовы и Функции&lt;br /&gt;&amp;nbsp;&amp;nbsp; 5.3&amp;nbsp; Разное&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp; Введение в Указатели на Функции&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.1&amp;nbsp; Что такое "Указатель на Функцию"?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2&amp;nbsp; Вводный Пример или "Как Заменить Конструкцию Switch-Case"&lt;br /&gt;&lt;br /&gt;Указатели на функции обеспечивают несколько чрезвычайно интересных, эффективных и изящных программных методов. Вы можете использовать их, чтобы заменить &lt;b&gt;switch/if&lt;/b&gt;-операторы, реализовать ваше собственное позднее связывание (&lt;i&gt;late-binding&lt;/i&gt;) или обратные вызовы (&lt;i&gt;callbacks&lt;/i&gt;). К сожалению, вероятно из-за их сложного синтаксиса, в большинстве компьютерных книг и документации к ним относятся весьма неприязненно. Если о них и говорится, то довольно-таки кратко и поверхностно. Они в меньшей степени подвержены ошибкам, чем обычные указатели, вы никогда не будете выделять или освобождать для них память. Все, что вы должны сделать, - это понять, чем они являются и изучить их синтаксис. Но имейте в виду: вы всегда должны спрашивать себя, действительно ли вы нуждаетесь в указателе на функцию. Приятно реализовать собственное позднее связывание, но использование существующих структур C ++ может сделать ваш код удобочитаемым и более понятным. Один из аспектов в случае позднего связывания - время выполнения: если вы вызываете виртуальную функцию, ваша программа должна определить, какую функцию нужно вызвать. Это делается посредством виртуальной таблицы (&lt;i&gt;V-Table&lt;/i&gt;), содержащей все возможные функции. Это стоит некоторого времени на каждый вызов, и возможно вы можете сократить время, используя указатели на функции вместо виртуальных функций. Возможно, нет... Кстати: современные компиляторы очень хороши! С моим компилятором Borland экономия времени от вызова виртуальной функции, умножающей два числа типа &lt;b&gt;float&lt;/b&gt;, составила приблизительно 2 процента.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1.1&amp;nbsp; Что такое "Указатель на Функцию"?&lt;br /&gt;&lt;br /&gt;Указатели на функции - это указатели, т.е. переменные, которые указывают на адрес функции. Вы должны помнить, что запущенная программа получает определённую область в оперативной памяти. И исполняемый скомпилированный программный код, и используемые переменные, размещаются в этой памяти. Таким образом, функция в коде программы так же как, например, символьное поле, ничто иное, как адрес. Очень важно, как вы, или лучше ваш компилятор/процессор, интерпретируете память, на которую указывает указатель.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1.2&amp;nbsp; Вводный Пример или "Как Заменить Оператор Switch"&lt;br /&gt;&lt;br /&gt;Когда Вы хотите вызвать функцию &lt;b&gt;DoIt()&lt;/b&gt; в определенной точке, обозначенной в вашей программе меткой, вы только помещаете вызов функции &lt;b&gt;DoIt()&lt;/b&gt; в точке метки в вашем исходном коде. Затем вы компилируете ваш код, и каждый раз, когда ваша программа доходит до метки, вызывается ваша функция. Все Ok. Но что вы можете сделать, если вы не знаете, в какой момент времени должна быть вызвана функция? Что вы делаете, когда хотите решить это во время выполнения? Возможно, вы захотите использовать так называемую Функцию обратного вызова (&lt;i&gt;Callback Function&lt;/i&gt;), или выбрать одну функцию из пула возможных функций. Однако, вы также можете решить проблему, используя оператор &lt;b&gt;switch,&lt;/b&gt; где вы вызываете функции точно так, как вы этого хотите, используя различные переходы (&lt;i&gt;branches&lt;/i&gt;). Но существует другой способ: используйте указатель на функцию! &lt;br /&gt;&lt;br /&gt;В следующем примере мы рассмотрим задачу по выполнению одной из четырех основных арифметических операций. Сначала задача решена с использованием оператора &lt;b&gt;switch&lt;/b&gt;. Затем демонстрируется, как то же самое может быть сделано с помощью указателя на функцию. Это только пример, и задача настолько проста, что я предполагаю, никто не будет для этого использовать указатель на функцию;-)&lt;br /&gt;&lt;font color="#999999"&gt;//------------------------------------------------------------------------------------&lt;br /&gt;// 1.2 Вводный Пример или "Как Заменить Оператор Switch"&lt;br /&gt;// Задача: Выполните одну из четырех основных арифметических операций, определенных &lt;br /&gt;// символами '+', '-,'' * 'или' / '.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="#999999"&gt;// Четыре арифметических операции ... одна из этих функций выбирается&lt;br /&gt;// во время выполнения с помощью switch или указателя на функцию&lt;/font&gt;&lt;br /&gt;&lt;font color="#99ccff"&gt;float&lt;/font&gt; Plus&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;font color="#99ccff"&gt;float&lt;/font&gt; a, &lt;font color="#99ccff"&gt;float &lt;/font&gt;b) { &lt;b&gt;return&lt;/b&gt; a+b; }&lt;br /&gt;&lt;font color="#99ccff"&gt;float &lt;/font&gt;Minus&amp;nbsp;&amp;nbsp; (&lt;font color="#99ccff"&gt;float &lt;/font&gt;a, &lt;font color="#99ccff"&gt;float&lt;/font&gt; b) { &lt;b&gt;return&lt;/b&gt; a-b; }&lt;br /&gt;&lt;font color="#99ccff"&gt;float&lt;/font&gt; Multiply(&lt;font color="#99ccff"&gt;float &lt;/font&gt;a, &lt;font color="#99ccff"&gt;float &lt;/font&gt;b) { &lt;b&gt;return&lt;/b&gt; a*b; }&lt;br /&gt;&lt;font color="#99ccff"&gt;float &lt;/font&gt;Divide&amp;nbsp; (&lt;font color="#99ccff"&gt;float &lt;/font&gt;a, &lt;font color="#99ccff"&gt;float&lt;/font&gt; b) { &lt;b&gt;return&lt;/b&gt; a/b; }&lt;br /&gt;&lt;br /&gt;&lt;font color="#999999"&gt;// Решение с помощью оператора switch - &amp;lt;opCode&amp;gt; определяющего, какая операция выполнится&lt;/font&gt;&lt;br /&gt;&lt;font color="#99ccff"&gt;void&lt;/font&gt; Switch(&lt;font color="#99ccff"&gt;float&lt;/font&gt; a, &lt;font color="#99ccff"&gt;float&lt;/font&gt; b, &lt;font color="#99ccff"&gt;char&lt;/font&gt; opCode)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#99ccff"&gt;float&lt;/font&gt; result;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#999999"&gt;// выполнение операции&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;switch&lt;/b&gt;(opCode)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;case&lt;/b&gt; &lt;font color="#ff9900"&gt;'+' &lt;/font&gt;: result = Plus&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (a, b); &lt;b&gt;break&lt;/b&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;case&lt;/b&gt; &lt;font color="#ff9900"&gt;'-' &lt;/font&gt;: result = Minus&amp;nbsp;&amp;nbsp;&amp;nbsp; (a, b); &lt;b&gt;break&lt;/b&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;case&lt;/b&gt; &lt;font color="#ff9900"&gt;'*' &lt;/font&gt;: result = Multiply (a, b); &lt;b&gt;break&lt;/b&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;case&lt;/b&gt; &lt;font color="#ff9900"&gt;'/' &lt;/font&gt;: result = Divide&amp;nbsp;&amp;nbsp; (a, b); &lt;b&gt;break&lt;/b&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;font color="#ff0000"&gt;"Switch: 2+5=" &lt;/font&gt;&amp;lt;&amp;lt; result &amp;lt;&amp;lt; endl; &lt;font color="#999999"&gt;// отображение результата&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#999999"&gt;// Решение с помощью указателя на функцию - &amp;lt;pt2Func&amp;gt;;&amp;nbsp; &lt;br /&gt;// pt2Func указывет на функцию, принимающую два аргумента типа float и возвращающую также float.&lt;br /&gt;// Указатель на функцию "определяет", какая операция будет выполнена.&lt;/font&gt;&lt;br /&gt;&lt;font color="#99ccff"&gt;void&lt;/font&gt; Switch_With_Function_Pointer(&lt;font color="#99ccff"&gt;float&lt;/font&gt; a, &lt;font color="#99ccff"&gt;float&lt;/font&gt; b, &lt;font color="#99ccff"&gt;float &lt;/font&gt;(*pt2Func)(&lt;font color="#99ccff"&gt;float&lt;/font&gt;, &lt;font color="#99ccff"&gt;float&lt;/font&gt;))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#99ccff"&gt;float &lt;/font&gt;result = pt2Func(a, b); &lt;font color="#999999"&gt;// вызов через указатель на функцию&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;font color="#ff99cc"&gt;&lt;font color="#ff0000"&gt;"Switch заменён указателем на функцию: 2-5="&lt;/font&gt;;&lt;/font&gt; &lt;font color="#999999"&gt;// отображение результата&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#999999"&gt;// Выполнение кода примера&lt;/font&gt;&lt;br /&gt;&lt;font color="#99ccff"&gt;void&lt;/font&gt; Replace_A_Switch()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; &lt;font color="#ff0000"&gt;"Выполнение функции 'Replace_A_Switch'" &lt;/font&gt;&amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Switch(2, 5,&lt;font color="#999999"&gt; &lt;/font&gt;&lt;font color="#999999"&gt;/* '+' будет выполнена выбранная функция 'Plus' */ &lt;/font&gt;&lt;font color="#ff6600"&gt;'+'&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; Switch_With_Function_Pointer(2, 5, &lt;font color="#999999"&gt;/* указатель на функцию 'Minus' */ &lt;/font&gt;&amp;amp;Minus);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Важное замечание&lt;/b&gt;: Указатель на функцию всегда указывает на функцию со строго определённой сигнатурой! Так все функции, к которым вы хотите обращаться через указатель, должны иметь такие же входные параметры и возвращаемое значение (что и в объявлении указателя).</content>
  </entry>
</feed>
