<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://lj.rossia.org/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>smi13</title>
  <link>http://lj.rossia.org/users/smi13/</link>
  <description>smi13 - LJ.Rossia.org</description>
  <managingEditor>smi13</managingEditor>
  <lastBuildDate>Mon, 01 Jun 2009 18:50:29 GMT</lastBuildDate>
  <generator>LiveJournal / LJ.Rossia.org</generator>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/smi13/645.html</guid>
  <pubDate>Mon, 01 Jun 2009 18:50:29 GMT</pubDate>
  <title>Вопросы по С++ и не только.</title>
  <link>http://lj.rossia.org/users/smi13/645.html</link>
  <description>&lt;p align=&quot;justify&quot;&gt;Не все вопросы касаются именно языка C++. Как например, 11. Это, скорее, способ мышления.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Что такое explicit?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Ключевое слово explicit используется при объявлении конструктора класса, во избежании нежелательного                         неявного преобразования типов. Реализуя параметризованный (скажем, &lt;font size=&quot;2&quot; face=&quot;Courier new&quot;&gt;int&lt;/font&gt;) конструктор для некоторого класса (скажем, &lt;font size=&quot;2&quot; face=&quot;Courier new&quot;&gt;A&lt;/font&gt;), мы тем самым даем возможность этому преобразованию &lt;font size=&quot;2&quot; face=&quot;Courier new&quot;&gt;A a = 5;&lt;/font&gt;. Ясно, что выполнится как раз параметризованный конструктор, при условии отсутствия explicit и реализации оператора присваивания.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое mutable?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Указание спецификатора mutable у некоторого члена класса переопределяет свойство постоянства у этого члена. Проще говоря, такие члены могут быть модифицированы const-методами класса.&lt;br /&gt;Вообще, есть подозрение, что за mutable стоит &lt;a href=&quot;http://en.wikipedia.org/wiki/Mutable&quot;&gt;длинная история&lt;/a&gt;, а также зачастую он вызывает &lt;a href=&quot;http://groups.google.ru/group/comp.lang.c++.moderated/browse_frm/thread/20ac2a014a7c13a0/985d6e85a0ff599f?q=mutable+const_cast&amp;amp;rnum=12&amp;amp;hl=ru#985d6e85a0ff599f&quot;&gt;множество недоумений&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Могут ли static-функции быть const?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Однозначно нет. В static функции не передается указатель this. В const - передается, да еще и константный.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое const_cast, dynamic_cast, static_cast?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Преобразование типов в C++. Есть &lt;a href=&quot;http://alenacpp.blogspot.com/2005/08/c.html&quot;&gt;мнение&lt;/a&gt;, что использование этих ключевых слов очень редко бывает обоснованным.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;const_cast&lt;/li&gt;&lt;br /&gt;Снятие квалификаторов const, volatile с переменной. Ошибка приведения - ошибка компиляции. &lt;br /&gt;&lt;br /&gt;&lt;li&gt;dynamic_cast&lt;/li&gt;&lt;br /&gt;Приведение указателей либо ссылок на полиморфные классы друг к другу. Полиморфизм означает в данном случае наличие хоть одной виртуальной функции и он критичен для dynamic_cast: ошибка компиляции в противном случае. Ошибка выполнения сигнализируется возвращенным NULL в случае указателей и сообщением bad_cast в случае ссылок. &lt;br /&gt;&lt;br /&gt;&lt;li&gt;static_cast&lt;/li&gt;&lt;br /&gt;Приведение одного типа к другому. Используются встроенные правила в случае встроенных типов, свои правила в случае своих. Если речь идет об указателях, то либо один из них обязан быть void *, либо оба должны указывать на объекты классов из одной иерархии. Ошибка приведения - ошибка компиляции и undefined behavior в случае ошибки приведения указателей на объекты классов из одной иерархии.  &lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое инстанцирование шаблонов?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Вообще &lt;a href=&quot;http://ru.wikipedia.org/wiki/Объект_(программирование)&quot;&gt;инстанцирование&lt;/a&gt; есть создание экземпляра класса. Инстанцирование шаблонов судя по всему есть полиморфное инстанцирование. Пример: vector&amp;#60int&amp;#62 a; Остается неясным обязательна ли при инстанцировании аллокация.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое частичная специализация шаблонов?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Синтаксически это определение еще одного шаблона, отличающегося от общего лишь подстановкой фактических типов или значений. Специализированный шаблон может иметь собственные методы и члены, он не связан с общим. Может использоваться, например, для оптимизации реализации некоторого случая для особого типа. Частичная специализация шаблона неявно конкретизируется при использовании в программе, а именно: если для шаблона класса объявлены частичные специализации, компилятор выбирает то определение, которое является наиболее специализированным для заданных аргументов.  &lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Применима ли частичная специализация к функциям?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;В C++ нет такой возможности. Ее отсутствие часто аргументируют &lt;a href=&quot;http://habrahabr.ru/blogs/cpp/54762/#comment_1469150&quot;&gt;примером&lt;/a&gt;, в котором показана ошибочность интуиции разработчика.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое виртуальный деструктор и зачем он нужен?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Виртуальный деструктор необходим для корректного удаления экземпляра класса через указатель на экземпляр базового класса. Отличиями от обычной виртуальной функции являются: всегда имеет тело, при наследовании не перегружается, а расширяется в том смысле, что при вызове сначала выполняются деструкторы производных классов, а затем базового. Таким образом классы-наследники класса с одной виртуальной функцией - деструктором полиморфными не являются.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое чисто виртуальный деструктор?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Используется для придания абстрактности классу, запрета инстанцирования объекта данного класса. Миф о том, что не может иметь тела - миф, тело может быть, хоть это и не соответствует нынешнему стандарту. Отличается от чисто виртуальных функций тем, что производные классы не обязаны иметь определения деструктора.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что происходит, если исключение выбрасывается в конструкторе?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Объект не создается, деструктор в дальнейшем не вызывается, отсюда возможная проблема - утечки памяти.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое агрегация и композиция?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Композиция - методика создания сложных объектов или типов данных из более простых. Часто говорят, что объекты входящие в композицию сложного объекта находятся в отношении &quot;has-a&quot;, это означает, что простые объекты принадлежат, подчиняются сложному. Сложный объект выполняет функцию сложнее, чем просто &quot;сумма&quot; функций простых. Пример: автомобиль (сложный объект) и колеса, руль (простые).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Агрегация отличается от композиции тем, что отношение подчинения простых объектов сложному устраняется. Пример: университет и его факультеты (композиция), университет и его профессора (агрегация). Если перестает существовать университет перестают и факультеты, но не профессора.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Класс стратегия, класс свойств?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое полиморфизм? Средства C++ реализующие полиморфизм.&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Полиморфизм - взаимозаменяемость объектов с одинаковым интерфейсом. &quot;Один интерфейс, много методов&quot;. Перегрузка операторов и функций, шаблоны, параметры по умолчанию - это примеры полиморфизма, относящегося ко времени компиляции. Полиморфизм периода выполнения реализуется использованием виртуальных функций. Надо заметить, что полиморфизм времени выполнения неразрывно связан с использование производных классов так как без них использование виртуальности не имеет смысла. &lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое срезка &lt;a href=&quot;http://en.wikipedia.org/wiki/Object_slicing&quot;&gt;(slicing)&lt;/a&gt;&lt;/b&gt;&lt;/li&gt; &lt;br /&gt;Часто случается, что класс-родитель содержит меньше информации, чем класс-потомок. Присваивание объекту класса-родителя объект класса-потомка, либо передачу в функцию, принимающую объект класса-родителя, объекта класса-потомка и называют срезкой.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Как реализуется возможность перегрузки функций в С++?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Процесс разрешения перегрузки разделяют на три этапа:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Выделяется множество перегруженных функций для данного вызова, а также свойства списка аргументов, переданных функции.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Выбираются те из перегруженных функций, которые могут быть вызваны с данными аргументами, с учетом их количества и типов.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Находится функция, которая лучше всего соответствует вызову. &lt;i&gt;Говорят, что здесь имеет место задача линейного программирования.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Когда может понадобиться конструктор объявленный с private?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Имеется информация как минимум о двух случаях обоснованности определения конструкторов в private:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Копирующий конструктор. Во избежании багов возникающих из-за забытого символа ”&amp;” в описании функции.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Имеется необходимость создавать экземпляры класса только внутри иерархии.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое RTTI?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Run-Time Type Identification. Динамическая идентификация типов. В языке С++ возникают ситуации, в которых тип объекта неизвестен во время компиляции, так как его природа сможет быть выяснена только в период выполнения. Полиморфизм влечет за собой такие ситуации. Инструментами RTTI в C++ являются операторы dynamic_cast и typeid. Последний используется для получения типа объекта во время выполнения программы.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое static assert?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Аналог динамического assert для времени компиляции. &lt;br /&gt;Примеры реализации:&lt;br /&gt;&lt;ul&gt;&lt;font face=&quot;courier new&quot; size=&quot;2&quot;&gt;&lt;br /&gt;&lt;li&gt;#define CASSERT(COND) \&lt;br /&gt;typedef char __AP_COMM_CASSERT [(COND) ? 1 : -1]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;#define CASSERT(COND) \&lt;br /&gt;switch(0){case 0:case (COND):;}&lt;/li&gt;&lt;/ul&gt;&lt;/font&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое &lt;a href=&quot;http://en.wikipedia.org/wiki/Liskov_substitution_principle&quot;&gt;LSP&lt;/a&gt;?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Liskov substitution principle. Принцип подстановки Барбары Лисков. Формулируется следующим образом: &quot;Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.&quot; Проще говоря, классы наследники обязаны обеспечивать ожидаемое обуславливаемое предком внешнее поведение.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Что такое &lt;a href=&quot;http://en.wikipedia.org/wiki/Open/closed_principle&quot;&gt;Open/Closed Principle&lt;/a&gt;?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;Формулировка: &quot;Программы и сущности (классы, модули, функции) должны быть открыты для расширения и закрыты для изменения&quot;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;В чем отличие между &lt;font face=&quot;courier new&quot; size=&quot;2&quot;&gt;typename&lt;/font&gt; и &lt;font face=&quot;courier new&quot; size=&quot;2&quot;&gt;class&lt;/font&gt;?&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;По стандарту семантических и синтаксических различий нет. &lt;i&gt;Тут надо заметить, во избежании путаницы, что речь идет об отличиях указанных ключевых слов в контексте разговора о параметрах шаблонов. Ясно, что например при определении класса нужно писать &lt;font face=&quot;courier new&quot; size=&quot;2&quot;&gt;class&lt;/font&gt;, а не &lt;font face=&quot;courier new&quot; size=&quot;2&quot;&gt;typename&lt;/font&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/smi13/645.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/smi13/645&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/smi13/645.html</comments>
  <category>c++</category>
  <category>programming</category>
</item>
</channel>
</rss>
