<?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/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>C-lang</title>
  <link>http://cpplang.livejournal.com/</link>
  <description>C-lang - LiveJournal.com</description>
  <lastBuildDate>Thu, 17 Jan 2008 13:37:03 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>cpplang</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>http://p-userpic.livejournal.com/69298679/14320351</url>
    <title>C-lang</title>
    <link>http://cpplang.livejournal.com/</link>
    <width>94</width>
    <height>94</height>
  </image>

<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/2615.html</guid>
  <pubDate>Thu, 17 Jan 2008 13:37:03 GMT</pubDate>
  <link>http://cpplang.livejournal.com/2615.html</link>
  <description>&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;    (в Стандарте говорится:&quot;Операторная функция ... должна содержать по крайней мере один параметр, &lt;br /&gt;    тип которого - класс, ссылка на класс, перечисление или ссылка на перечисление.&quot;). &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;	По этой же причине не рекомендуется перегружать оператор &apos;,&apos; для которого сначала производится оценка выражения,&lt;br /&gt;        стоящего справа, а затем выражения, стоящего слева.&lt;/b&gt;&lt;/pre&gt;</description>
  <comments>http://cpplang.livejournal.com/2615.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/2490.html</guid>
  <pubDate>Tue, 08 Jan 2008 22:04:40 GMT</pubDate>
  <title>И снова ЗДРАВСТВУЙТЕ</title>
  <link>http://cpplang.livejournal.com/2490.html</link>
  <description>Эх, как быстро заканчивается всё хорошее. Вот и снова пора на работу. &lt;br /&gt;Для раскачки занялся своим сайтом - давно хотел сделать, да вот руки как-то всё не доходили. Одним словом, теперь для каждой статьи, чьё содержимое может быть оспорено, будет создан раздел &apos;Замечания&apos;. Для статьи &apos;Указатели на Функции&apos; уже начал публиковать замечания, между прочим по мотивам тех, что были сделаны членами сообществ программистов на LiveJournal. &lt;br /&gt;&lt;br /&gt;P.S. Лучше всего пересылать замечания на почту на clang@list.ru.</description>
  <comments>http://cpplang.livejournal.com/2490.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/2241.html</guid>
  <pubDate>Wed, 26 Dec 2007 20:16:05 GMT</pubDate>
  <title>С наступающим Новым годом!</title>
  <link>http://cpplang.livejournal.com/2241.html</link>
  <description>&lt;lj-embed id=&quot;3&quot; /&gt;</description>
  <comments>http://cpplang.livejournal.com/2241.html</comments>
  <lj:mood>good</lj:mood>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/1981.html</guid>
  <pubDate>Wed, 12 Dec 2007 18:36:44 GMT</pubDate>
  <title>Тематические задачи по C++ и STL</title>
  <link>http://cpplang.livejournal.com/1981.html</link>
  <description>Мои коллеги по работе создали &lt;a href=&quot;http://ysoft.ru&quot;&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=&quot;http://ysoft.ru&quot;&gt;http://ysoft.ru&lt;/a&gt; )&lt;/i&gt;</description>
  <comments>http://cpplang.livejournal.com/1981.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/1711.html</guid>
  <pubDate>Fri, 07 Dec 2007 21:12:33 GMT</pubDate>
  <link>http://cpplang.livejournal.com/1711.html</link>
  <description>Вот попались такие задачки-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=&quot;#339966&quot;&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#3366ff&quot;&gt;&lt;font color=&quot;#ffcc99&quot;&gt;int&lt;/font&gt; &lt;/font&gt;main()&lt;br /&gt;{&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#3366ff&quot;&gt;&lt;font color=&quot;#ffcc99&quot;&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=&quot;#ff6600&quot;&gt;&quot;*&quot;&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=&quot;#339966&quot;&gt;#include&amp;lt;iostream&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#ffcc99&quot;&gt;char&lt;/font&gt; a[40]={};&lt;br /&gt;&lt;font color=&quot;#ffcc99&quot;&gt;char&lt;/font&gt;* p1=a[0];&lt;br /&gt;&lt;font color=&quot;#ffcc99&quot;&gt;char&lt;/font&gt;* p2=a[20];&lt;br /&gt;&lt;font color=&quot;#ffcc99&quot;&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;}</description>
  <comments>http://cpplang.livejournal.com/1711.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/1404.html</guid>
  <pubDate>Wed, 05 Dec 2007 22:54:59 GMT</pubDate>
  <title>Заметки о C++</title>
  <link>http://cpplang.livejournal.com/1404.html</link>
  <description>На моём сайте, &lt;a href=&quot;http://cpplang.narod.ru&quot;&gt;C-lang&lt;/a&gt;, появился новый раздел &quot;Заметки о C  &quot;. Здесь будут публиковаться переводы драфтов и прочего, например, не имеющего авторства.&lt;br /&gt;&lt;br /&gt;P.S. Труд Ларса Хенделя подвергся вполне заслуженной критике со стороны коллег-разработчиков, - действительно много ошибок и неточностей. Надо будет не забыть перепроверить содержимое статьи.</description>
  <comments>http://cpplang.livejournal.com/1404.html</comments>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/1260.html</guid>
  <pubDate>Mon, 03 Dec 2007 08:42:10 GMT</pubDate>
  <title>Lars Haendel. The Function Pointer Tutorials.</title>
  <link>http://cpplang.livejournal.com/1260.html</link>
  <description>Закончен перевод руководства Ларса Хенделя. &lt;br /&gt;Выложил на &lt;a href=&quot;http://cpplang.narod.ru&quot; target=&quot;clang&quot;&gt;C-lang&lt;/a&gt;.</description>
  <comments>http://cpplang.livejournal.com/1260.html</comments>
  <lj:mood>good</lj:mood>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/982.html</guid>
  <pubDate>Sun, 25 Nov 2007 21:42:35 GMT</pubDate>
  <title>ГОСТы для разработчиков программного обеспечения</title>
  <link>http://cpplang.livejournal.com/982.html</link>
  <description>&lt;a href=&quot;http://ysoft.ru/main/ShowId=1029_x_2.html&quot;&gt;Скачать можно тут&lt;/a&gt;</description>
  <comments>http://cpplang.livejournal.com/982.html</comments>
  <lj:mood>cheerful</lj:mood>
  <lj:security>public</lj:security>
</item>
<item>
  <guid isPermaLink='true'>http://cpplang.livejournal.com/758.html</guid>
  <pubDate>Sun, 25 Nov 2007 00:08:48 GMT</pubDate>
  <title>Introduction</title>
  <link>http://cpplang.livejournal.com/758.html</link>
  <description>Просматривая блог Алёны Сагалаевой (&lt;a href=&quot;http://alenacpp.blogspot.com&quot;&gt;http://alenacpp.blogspot.com&lt;/a&gt;) обнаружил ссылку на ресурс, посвященный указателям на функцию и обратным вызовам &lt;a href=&quot;http://www.newty.de/fpt/index.html&quot;&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; Что такое &quot;Указатель на Функцию&quot;?&lt;br /&gt;&amp;nbsp;&amp;nbsp; 1.2&amp;nbsp; Вводный Пример или &quot;Как Заменить Оператор Switch&quot; &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; Что такое &quot;Указатель на Функцию&quot;?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2&amp;nbsp; Вводный Пример или &quot;Как Заменить Конструкцию Switch-Case&quot;&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; Что такое &quot;Указатель на Функцию&quot;?&lt;br /&gt;&lt;br /&gt;Указатели на функции - это указатели, т.е. переменные, которые указывают на адрес функции. Вы должны помнить, что запущенная программа получает определённую область в оперативной памяти. И исполняемый скомпилированный программный код, и используемые переменные, размещаются в этой памяти. Таким образом, функция в коде программы так же как, например, символьное поле, ничто иное, как адрес. Очень важно, как вы, или лучше ваш компилятор/процессор, интерпретируете память, на которую указывает указатель.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1.2&amp;nbsp; Вводный Пример или &quot;Как Заменить Оператор Switch&quot;&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=&quot;#999999&quot;&gt;//------------------------------------------------------------------------------------&lt;br /&gt;// 1.2 Вводный Пример или &quot;Как Заменить Оператор Switch&quot;&lt;br /&gt;// Задача: Выполните одну из четырех основных арифметических операций, определенных &lt;br /&gt;// символами &apos;+&apos;, &apos;-,&apos;&apos; * &apos;или&apos; / &apos;.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#999999&quot;&gt;// Четыре арифметических операции ... одна из этих функций выбирается&lt;br /&gt;// во время выполнения с помощью switch или указателя на функцию&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; Plus&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; a, &lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;b) { &lt;b&gt;return&lt;/b&gt; a+b; }&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;Minus&amp;nbsp;&amp;nbsp; (&lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;a, &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; b) { &lt;b&gt;return&lt;/b&gt; a-b; }&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; Multiply(&lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;a, &lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;b) { &lt;b&gt;return&lt;/b&gt; a*b; }&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;Divide&amp;nbsp; (&lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;a, &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; b) { &lt;b&gt;return&lt;/b&gt; a/b; }&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#999999&quot;&gt;// Решение с помощью оператора switch - &amp;lt;opCode&amp;gt; определяющего, какая операция выполнится&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;void&lt;/font&gt; Switch(&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; a, &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; b, &lt;font color=&quot;#99ccff&quot;&gt;char&lt;/font&gt; opCode)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; result;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#999999&quot;&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=&quot;#ff9900&quot;&gt;&apos;+&apos; &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=&quot;#ff9900&quot;&gt;&apos;-&apos; &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=&quot;#ff9900&quot;&gt;&apos;*&apos; &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=&quot;#ff9900&quot;&gt;&apos;/&apos; &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=&quot;#ff0000&quot;&gt;&quot;Switch: 2+5=&quot; &lt;/font&gt;&amp;lt;&amp;lt; result &amp;lt;&amp;lt; endl; &lt;font color=&quot;#999999&quot;&gt;// отображение результата&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#999999&quot;&gt;// Решение с помощью указателя на функцию - &amp;lt;pt2Func&amp;gt;;&amp;nbsp; &lt;br /&gt;// pt2Func указывет на функцию, принимающую два аргумента типа float и возвращающую также float.&lt;br /&gt;// Указатель на функцию &quot;определяет&quot;, какая операция будет выполнена.&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&gt;void&lt;/font&gt; Switch_With_Function_Pointer(&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; a, &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt; b, &lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;(*pt2Func)(&lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt;, &lt;font color=&quot;#99ccff&quot;&gt;float&lt;/font&gt;))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#99ccff&quot;&gt;float &lt;/font&gt;result = pt2Func(a, b); &lt;font color=&quot;#999999&quot;&gt;// вызов через указатель на функцию&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;font color=&quot;#ff99cc&quot;&gt;&lt;font color=&quot;#ff0000&quot;&gt;&quot;Switch заменён указателем на функцию: 2-5=&quot;&lt;/font&gt;;&lt;/font&gt; &lt;font color=&quot;#999999&quot;&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=&quot;#999999&quot;&gt;// Выполнение кода примера&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#99ccff&quot;&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=&quot;#ff0000&quot;&gt;&quot;Выполнение функции &apos;Replace_A_Switch&apos;&quot; &lt;/font&gt;&amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Switch(2, 5,&lt;font color=&quot;#999999&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#999999&quot;&gt;/* &apos;+&apos; будет выполнена выбранная функция &apos;Plus&apos; */ &lt;/font&gt;&lt;font color=&quot;#ff6600&quot;&gt;&apos;+&apos;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; Switch_With_Function_Pointer(2, 5, &lt;font color=&quot;#999999&quot;&gt;/* указатель на функцию &apos;Minus&apos; */ &lt;/font&gt;&amp;amp;Minus);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Важное замечание&lt;/b&gt;: Указатель на функцию всегда указывает на функцию со строго определённой сигнатурой! Так все функции, к которым вы хотите обращаться через указатель, должны иметь такие же входные параметры и возвращаемое значение (что и в объявлении указателя).</description>
  <comments>http://cpplang.livejournal.com/758.html</comments>
  <lj:mood>relaxed</lj:mood>
  <lj:security>public</lj:security>
</item>
</channel>
</rss>
