<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.itkazan.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Персональный блог Александра Демченко</title><subtitle type="html" /><id>http://www.itkazan.com/blogs/alexdemche/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.itkazan.com/blogs/alexdemche/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2007-02-16T14:25:00Z</updated><entry><title>const_cast и устранение дублирования кода</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2008/08/06/const-cast.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2008/08/06/const-cast.aspx</id><published>2008-08-06T10:22:00Z</published><updated>2008-08-06T10:22:00Z</updated><content type="html">&lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt; &lt;br /&gt;

&lt;p&gt;С точки зрения С++ если имеется некоторый тип T (без квалификаторов const или volatile), то тип const T (volatile T, const volatile T) является отдельным типом. Однако, во многих случаях можно использовать один вместо другого.&lt;/p&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; T f()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; T(); &lt;span&gt;//&lt;/span&gt; &lt;span&gt;T&lt;/span&gt; &lt;span&gt;не&lt;/span&gt; &lt;span&gt;является&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;T&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;С другой стороны такая взаимозаменяемость не всегда возможна, например:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; t = &lt;span style="color:blue;"&gt;12&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; const_ref_t = t;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; ref_t = const_ref_t; &lt;span&gt;//&lt;/span&gt; &lt;span&gt;ошибка,&lt;/span&gt; &lt;span&gt;присваивание&lt;/span&gt; &lt;span&gt;не&lt;/span&gt; &lt;span&gt;возможно&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Эти правила о том, когда можно и нельзя неявно приводить, направлены на соблюдение безопасности. Понятно, что безопасно преобразовывать неконстантный объект к константному, но, вообще говоря, не наоборот. Поэтому первый пример успешно компилируется, а второй - нет.&lt;/p&gt;

&lt;p&gt;Однако, конечно, программист может взять на себя ответственность, и явно осуществить небезопасное преобразование из константного объекта в неконстантный.&lt;/p&gt;

&lt;p&gt;Например, понятно, что во втором примере const_ref_t можно без опасения преобразовать к int&amp;amp;, поскольку объект, на который ссылается const_ref_t реально не является константой. В С++, как известно, за снятие и установление константности (или volatile) на объект отвечает оператор приведения const_cast. const_cast выглядит как шаблонная функция, параметром шаблона которой является тип, к которому осуществляется преобразование, а обычным параметром - объект, который нужно преобразовать. Вот как можно было бы использовать const_cast во втором примере:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; t = &lt;span style="color:blue;"&gt;12&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; const_ref_t = t;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; ref_t = &lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt;&amp;lt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp;&amp;gt;(const_ref_t); &lt;span&gt;//осуществляется&lt;/span&gt; &lt;span&gt;явное&lt;/span&gt; &lt;span&gt;преобразование&lt;br /&gt;&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;из&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;T&amp;amp;&lt;/span&gt; &lt;span&gt;к&lt;/span&gt; &lt;span&gt;T&amp;amp;.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;В результате такого преобразования, ref_t так же, как и const_ref_t ссылается на t. Поэтому ref_t++ влечет увеличение t на единицу. &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Несколько модифицируем пример, объявив t константой.&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; t = &lt;span style="color:blue;"&gt;12&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; const_ref_t = t;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; ref_t = &lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt;&amp;lt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp;&amp;gt;(const_ref_t); &lt;span&gt;//Снятие&lt;/span&gt; &lt;span&gt;константности,&lt;/span&gt; &lt;span&gt;ОК&lt;/span&gt;&lt;br /&gt;ref_t++; &lt;span&gt;//Попытка&lt;/span&gt; &lt;span&gt;изменить&lt;/span&gt; &lt;span&gt;константу&lt;/span&gt; &lt;span&gt;-&lt;/span&gt; &lt;span&gt;неопределенное&lt;/span&gt; &lt;span&gt;поведение.&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Приведение типов здесь пройдет успешно, но попытка модифицировать по полученной ссылке значение влечет неопределенное поведение, так как это по ссылке хранится дейтствительно константа.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;При этом поскольку поведение в указанной ситуации не определено, исполнив такой код, Вы не обязательно получите ошибку времени выполнения или какое-нибудь диагностическое сообщение. Я, например, откомпилировав этот код на компиляторе MS VS 2005 и запустив его, получил, что после ref_t++ значение константы не изменилось. При этом, конечно, поведение от запуска к запуску может меняться. В силу указанных причин такую ошибку сложно отловить в процессе отладки.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Использование const_cast для устранения дублирования кода.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Представим, что мы решили написать простую обертку для встроенных массивов C++:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;class&lt;/span&gt; Array&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;* pArray;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; length;&lt;br /&gt;   &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span&gt;//Methods&lt;/span&gt;&lt;br /&gt;};&lt;/pre&gt;

&lt;p&gt;Теперь нам хочется удобно обращаться к элементам массива - читать и изменять их. Поэтому мы решаем определить оператор []:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; ( (index &amp;lt; &lt;span style="color:blue;"&gt;0&lt;/span&gt;) || index &amp;gt;= length)&lt;br /&gt;            &lt;span style="font-weight:bold;"&gt;throw&lt;/span&gt; std::exception(&lt;span style="font-weight:bold;"&gt;&amp;quot;Incorrect&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;index&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; pArray;&lt;br /&gt;    }&lt;/pre&gt;

&lt;p&gt;Теперь, имея такой оператор мы можем читать и записывать элементы:&lt;/p&gt;

&lt;pre&gt;Array arr(&lt;span style="color:blue;"&gt;12&lt;/span&gt;);&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; val_3 = arr[&lt;span style="color:blue;"&gt;3&lt;/span&gt;]; &lt;span&gt;//Читаем&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;arr[&lt;span style="color:blue;"&gt;3&lt;/span&gt;] = &lt;span style="color:blue;"&gt;14&lt;/span&gt;; &lt;span&gt;//Изменяем&lt;/span&gt; &lt;/pre&gt;

&lt;p&gt;Но, что если мы хотим переменную arr объявить константой? В таком случае все еще логично позволять пользователю читать элементы, а записывать - конечно, нет. В случае нашего же метода, поскольку он объявлен неконстатным, он не сможет быть вызван даже для чтения:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; Array arr(&lt;span style="color:blue;"&gt;12&lt;/span&gt;);&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; val_3 = arr[&lt;span style="color:blue;"&gt;3&lt;/span&gt;]; &lt;span&gt;//Ошибка&lt;/span&gt; &lt;span&gt;компиляции,&lt;/span&gt; &lt;span&gt;&lt;br /&gt;//вызов&lt;/span&gt; &lt;span&gt;неконстатного&lt;/span&gt; &lt;span&gt;метода&lt;/span&gt; &lt;span&gt;для&lt;/span&gt; &lt;span&gt;константого&lt;/span&gt; &lt;span&gt;объекта.&lt;/span&gt; &lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
Для того, чтобы позволить читать элементы констатного массива, мы вынуждены создать константный аналог оператора []:
&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index) &lt;span style="font-weight:bold;"&gt;const&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; ( (index &amp;lt; &lt;span style="color:blue;"&gt;0&lt;/span&gt;) || index &amp;gt;= length)&lt;br /&gt;            &lt;span style="font-weight:bold;"&gt;throw&lt;/span&gt; std::exception(&lt;span style="font-weight:bold;"&gt;&amp;quot;Incorrect&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;index&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; pArray;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Теперь все нормально. Если оператор [] вызывается для констатного объекта, то вызовется его константный вариант. При этом, попытка изменить элемент константного массива вызовет ошибку компиляции, так как будет попытка присвоить значение по константной ссылке.&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; Array arr(&lt;span style="color:blue;"&gt;12&lt;/span&gt;);&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; val_3 = arr[&lt;span style="color:blue;"&gt;3&lt;/span&gt;]; &lt;span&gt;//ОК,&lt;/span&gt; &lt;span&gt;вызывается&lt;/span&gt; &lt;span&gt;operator[]&lt;/span&gt; &lt;span&gt;const&lt;/span&gt;&lt;br /&gt;arr[&lt;span style="color:blue;"&gt;3&lt;/span&gt;] = &lt;span style="color:blue;"&gt;12&lt;/span&gt;; &lt;span&gt;//Ошибка&lt;/span&gt; &lt;span&gt;компиляции&lt;/span&gt; &lt;span&gt;-&lt;/span&gt; &lt;span&gt;вызывается&lt;/span&gt; &lt;span&gt;operator[]&lt;/span&gt; &lt;span&gt;const,&lt;/span&gt; &lt;span&gt;&lt;br /&gt;//но&lt;/span&gt; &lt;span&gt;по&lt;/span&gt; &lt;span&gt;константной&lt;/span&gt; &lt;span&gt;ссылке,&lt;/span&gt; &lt;span&gt;которую&lt;/span&gt; &lt;span&gt;он&lt;/span&gt; &lt;span&gt;возвращает&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;нельзя&lt;/span&gt; &lt;span&gt;менять&lt;/span&gt; &lt;span&gt;объект&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;Итак, окончательно имеем класс:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;class&lt;/span&gt; Array&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;* pArray;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; length;&lt;br /&gt;   &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; ( (index &amp;lt; &lt;span style="color:blue;"&gt;0&lt;/span&gt;) || index &amp;gt;= length)&lt;br /&gt;            &lt;span style="font-weight:bold;"&gt;throw&lt;/span&gt; std::exception(&lt;span style="font-weight:bold;"&gt;&amp;quot;Incorrect&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;index&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; pArray[index];&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index) &lt;span style="font-weight:bold;"&gt;const&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; ( (index &amp;lt; &lt;span style="color:blue;"&gt;0&lt;/span&gt;) || index &amp;gt;= length)&lt;br /&gt;            &lt;span style="font-weight:bold;"&gt;throw&lt;/span&gt; std::exception(&lt;span style="font-weight:bold;"&gt;&amp;quot;Incorrect&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;index&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; pArray[index];&lt;br /&gt;    }&lt;br /&gt;}; &lt;/pre&gt;

&lt;p&gt;&amp;nbsp;Здесь мы конечно замечаем известный &lt;a href="http://insidecpp.ru/antipatterns/copy_and_paste/" target="_blank"&gt;антипаттерн Copy and Paste&lt;/a&gt;.&amp;nbsp; Одну и ту же функциональность нам пришлось просто скопировать и вставить в константный аналога оператора []. Если здесь это не так много - всего 3 строчки, то, конечно, в реальных ситуациях, этот общий код может быть гораздо больше.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Конечно, можно попробовать избавиться от Copy and Paste, например, просто вызвав из константного метода неконстантный. Так конечно сделать нельзя, поскольку неконстантный метод может изменять объект и компилятор это понимает. Однако, никакого вреда не будет, если мы из неконстантного метода вызовем констатный.&lt;/p&gt;

&lt;p&gt;Код мог бы выглядеть примерно так:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index)&lt;br /&gt; {&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; ref_elem = &lt;span&gt;/*&lt;/span&gt; &lt;span&gt;call&lt;/span&gt; &lt;span&gt;operator&lt;/span&gt; &lt;span&gt;[]&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt;&amp;lt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp;&amp;gt;(ref_elem); &lt;span&gt;//Безопасно,&lt;/span&gt; &lt;span&gt;&lt;br /&gt;    //так&lt;/span&gt; &lt;span&gt;как&lt;/span&gt; &lt;span&gt;реально&lt;/span&gt; &lt;span&gt;объект&lt;/span&gt; &lt;span&gt;не&lt;/span&gt; &lt;span&gt;является&lt;/span&gt; &lt;span&gt;константой&lt;/span&gt;&lt;br /&gt; }&lt;/pre&gt;

&lt;p&gt;Перед возвратом из функции нужно преобразовать полученную константную ссылку к неконстантной, поскольку мы планируем, что посредством неконстантного оператора [] пользователь может захотеть изменить элемент массива.&lt;/p&gt;

&lt;p&gt;Вопрос здесь в том как вызвать именно константный метод. Прямого способа указать компилятору, что мы хотим вызвать именно этот метод, нет. Однако, он сам это сделает, если увидит, что вызов [] применен к константному объекту. В таком случае, самое время вспомнить о const_cast и &amp;quot;навесить&amp;quot; константность на this. Итоговый код будет таким:&lt;/p&gt;

&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp; operator[](&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; index)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;return&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt;&amp;lt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt;&amp;amp;&amp;gt;( &lt;span style="font-weight:bold;"&gt;const_cast&lt;/span&gt;&amp;lt;&lt;span style="font-weight:bold;"&gt;const&lt;/span&gt; Array*&amp;gt;(&lt;span style="font-weight:bold;"&gt;this&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; operator[index] );&lt;br /&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;Дополнительные материалы:&lt;/pre&gt;&lt;pre&gt;&lt;a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;amp;seqNum=134" target="_blank"&gt;Операторы преобразования С++&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/6ke686zh.aspx" target="_blank"&gt;Константные функции-члены&lt;/a&gt;&lt;br /&gt;&lt;a href="http://insidecpp.ru/antipatterns/" target="_blank"&gt;Антипаттерны&lt;br /&gt;&lt;/a&gt;Книга Скотта Мэйерса &amp;quot;Эффективное использование С++. 55 верных советов улучшить структуру и код &lt;br /&gt;ваших программ&amp;quot;. Правило 3 (Как избежать дублирования в константных и неконстантных функциях-членах)&lt;br /&gt;&lt;/pre&gt;
&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1987" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="C++" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/C_2B002B00_/default.aspx" /><category term="C++ const member functions" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/C_2B002B00_+const+member+functions/default.aspx" /><category term="C++ cast operators" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/C_2B002B00_+cast+operators/default.aspx" /><category term="patterns" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/patterns/default.aspx" /><category term="const_cast" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/const_5F00_cast/default.aspx" /><category term="antipatterns" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/antipatterns/default.aspx" /></entry><entry><title>Questions from C++ examine</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2008/08/01/hello.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2008/08/01/hello.aspx</id><published>2008-08-01T09:09:00Z</published><updated>2008-08-01T09:09:00Z</updated><content type="html">&lt;p&gt;В зимнем семестре мне довелось в КГУ читать спец. курс по С++. Предполагалось, что студенты ранее могли не изучать C или С++.&lt;/p&gt;
&lt;p&gt;В зимнем семестре удалось рассмотреть базовые конструкции языка и классы. Шаблоны были перенесены на весенний семестр. Также одна лекция была посвящена макросам.&lt;/p&gt;
&lt;p&gt;Программу зимнего семестра можно &lt;a class="" href="http://itkazan.com/files/folders/alexdemche/entry1972.aspx"&gt;скачать тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Экзамен делилился на 2 части. Первая и главная часть - практическая. Нужно было реализовать класс и протестировать его. Это задание было в двух вариантах. Первым вариантом было реализовать класс DynamicArray - массив, при необходимости расширяющий свои размеры (похожий на std::vector). Вторым вариантом - реализовать класс String (строка). Практическое задание было достаточно подробно описано. Было небольшое preview, в котором описывались проблемы, которые разрабатываемый класс должен решить, был приведен интерфейс класса и, наконец, были приведены некоторые инварианты, которым класс должен удовлетворять. Последнее, в частности, должно было снизить вероятность возникновения спорных вопросов, когда, к примеру, я считаю, что некоторая функциональность работает неверно, а студент считает, что верно.&lt;/p&gt;
&lt;p&gt;Практическое задание (C++) - вариант 1 (&lt;a class="" href="http://itkazan.com/files/folders/alexdemche/entry1976.aspx"&gt;PDF скачать&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Практическое задание (C++) - вариант 2 (PDF скачать)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Второй маленькой частью экзамена были простенькие (где-то даже забавные)&amp;nbsp;вопросы по С++, которые не требуют большого исследования. Размещаю эти вопросы и жду ответов в комментах ;-)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;&lt;font face="SFRM1200"&gt;
&lt;p align="left"&gt;Пусть задан некоторый встроенный тип Т. Всегда ли результат sizeof(T) зависит от реализации?&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;font face="SFRM1200"&gt;
&lt;p align="left"&gt;Не используя инструкций выбора напишите функцию Round, которая принимает аргумент типа float и возвращает целое, являющееся результатом округления аргумента. Гарантируется, что аргумент&lt;br /&gt;неотрицателен.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Правила округления обычные: если дробная часть меньше 0.5, то выбирается наибольшее целое, не превышающее аргумента. В противном случае -&amp;nbsp; наименьшее целое, которое не меньше аргумента.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Приведите примеры (&amp;gt;1), когда отсутствие инициализатора в объявлении вызовет ошибку компиляции.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;Имеется следующий код:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char* pString = &amp;quot;C++&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char val = *(pString + 3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char* p = pString + 4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pString[0] = &amp;#39;D&amp;#39;;&lt;br /&gt;&lt;br /&gt;Определено ли поведение во второй, третьей и четвертой строках листинга. Если да, то каков результат их выполнения, а именно, что будет содержаться в val после выполнения второй строки, в p после&lt;br /&gt;выполнения третьей и в pString[0] после выполнения четвертой строки.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;&lt;em&gt;Здесь требуется некоторый комментарий. В течение семестра мы не рассматривали многомерные массивы и в этом задании студентам предлагается догадаться до того, как это можно сделать в C++ самостоятельно.&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Для данного типа T тип T* является &amp;quot;указателем на T&amp;quot;. То есть переменная типа T* может хранить адрес объекта типа T. Из этого определения следует, что если в качестве типа T взять T*, то переменная типа T** является указателем на T* и может хранить адрес переменной типа T*.&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Рассмотрим это на примере:&lt;br /&gt;&amp;nbsp;&amp;nbsp; int main() &lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int x = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int* pX = &amp;amp;x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int** ppX = &amp;amp;pX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;Переменная ppX имеет тип &amp;quot;указатель на указатель на целое&amp;quot; и, следовательно, может хранить адрес объекта, являющегося указателем на целое.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Выделение памяти под массив указателей на T (по аналогии) происходит с помощью операции new T*[], тип возвращаемого значения такой операции --- T**.&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;em&gt;Двумерный массив&lt;/em&gt; можно считать одномерным массивом, каждый элемент которого сам является массивом.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Используя рассмотренные сведения, написать код выделения памяти под двумерный целочисленный массив из m строк и n столбцов (m и n неизвестны на момент компиляции).&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Написать код освобождения памяти для полученного массива.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Дан следующий код:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; #include&amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; using namespace std;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; enum Number &lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; One = 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Two,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Three&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; int main() &lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number a = ...;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(a)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case One:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;&amp;quot;One&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case Two:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;&amp;quot;Two&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case Three:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;&amp;quot;Three&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;&amp;quot;Don&amp;#39;t know&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;Строка Numbers a = ...; - это псевдокод. а инициализируется некоторым значением. Что выведется на экран если a равно One, Two, Three? Переписать приведенный код с использованием инструкции выбора if вместо switch.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Напишите функции PrefixIncrement и PostfixIncrement которые увеличивают на единицу значение целого числа, переданного в качестве параметра. Обеспечьте, чтобы первая функция имела поведение аналогичное префиксному инкременту, а вторая - постфиксному.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Почему следующий код вызовет ошибку компиляции:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int x = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int* p = &amp;amp;x++;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;Скомпилируется ли такой код:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int x = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int* p = &amp;amp;(++x);&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Почему следующий код вызовет неопределенное поведение:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int* pInt = new int(12);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout&amp;lt;&amp;lt;*pInt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete[] pInt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Сколько раз выполнится следующий цикл&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 10; i--; i &amp;gt; 10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Do something&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Свой ответ объяснить.&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;strong&gt;Подсказка&lt;/strong&gt;. Не торопитесь с ответом.&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Имеется следующий код:&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; class A&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;A(const A&amp;amp; copy)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Do something&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A() {}&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="SFRM1200"&gt;class B&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;A a1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A a2;&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Все ли конструкторы, которые при необходимости генерируются компилятором неявно, могут быть им корректно созданы в случае с классом B.&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;В частности, будет ли код компилироваться, если к указанному коду добавить main:&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; int main() &lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B c = b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Пусть имеется некоторый пользовательский бинарный оператор, определенный в виде&amp;nbsp; глобальной функции. Как гарантировать, чтобы первый его операнд был модифицируемым(неконстантным) lvalue? (Гарантировать в том смысле, что если это не так, то возникнет ошибка компиляции). Как гарантировать, что его первый операнд&lt;br /&gt;может быть константным объектом? Как это гарантировать, если оператор определен в виде метода класса?&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Имеется следующий код:&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; class A{ };&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; class B : protected A { };&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; class C : public B&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void SomeMethod()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A* pA = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp; int main()&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;A* pA = &amp;amp;b;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Какие строки этого кода вызовут ошибку компиляции и почему?&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Изменилась ли бы ситуация и, если да, то как, если при наследовании B от A использовалось бы закрытое, открытое наследование?&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;Имеется следующий код:&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; class A&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; protected:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;int val;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;A(int val)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this-&amp;gt;val = val;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="SFRM1200"&gt;class B : A&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;val = 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;&lt;br /&gt;Почему код не компилируется при таким образом определенном конструкторе класса B. Измените конструктор B так, чтобы код успешно компилировался.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="SFRM1200"&gt;Будет ли код компилироваться и почему, если конструктор B определить следующим образом:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; class B : A&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B() : val(3) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;&lt;font face="SFRM1200"&gt;&lt;a class="" href="http://itkazan.com/files/folders/alexdemche/entry1975.aspx"&gt;Скачать вопросы в PDF&lt;/a&gt;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1974" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="C++" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/C_2B002B00_/default.aspx" /><category term="questions" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/questions/default.aspx" /><category term="examine" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/examine/default.aspx" /></entry><entry><title>С Великим Днем Победы!</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/05/09/1110.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/05/09/1110.aspx</id><published>2007-05-10T03:40:00Z</published><updated>2007-05-10T03:40:00Z</updated><content type="html">&lt;P&gt;Поздравляю всех С Великим Днем Победы!&lt;/P&gt;
&lt;P&gt;Это, пожалуй, один из немногих настоящих праздников!&lt;/P&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=1110" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author></entry><entry><title>О нас написали...</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/04/01/999.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/04/01/999.aspx</id><published>2007-04-01T20:08:00Z</published><updated>2007-04-01T20:08:00Z</updated><content type="html">О начале нового дела студентами ВМК написали в мартовском номере за 2007 год газеты "Казанский Университет". Примечательно, что все трое являются участниками &lt;a&gt;itkazan.com&lt;/a&gt;.&lt;br&gt;Сама статья в&lt;a href="http://www.itkazan.com/files/folders/998/download.aspx"&gt; прикрепленном файле&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=999" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="start-up" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/start-up/default.aspx" /><category term="article" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/article/default.aspx" /><category term="business" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/business/default.aspx" /><category term="paper" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/paper/default.aspx" /><category term="CMC KSU" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/CMC+KSU/default.aspx" /></entry><entry><title>Самые оригинальные гаджеты марта</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/04/01/996.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/04/01/996.aspx</id><published>2007-04-01T06:40:00Z</published><updated>2007-04-01T06:40:00Z</updated><content type="html">На сайте&lt;a href="http://dp.ru"&gt; dp.ru&lt;/a&gt; опубликована &lt;a href="http://www.dp.ru/msk/news/hitech/2007/03/29/210590"&gt;статья&lt;/a&gt; с описанием самых оригинальных по мнению авторов гаджетов марта. Интересен подход авторов, которые пытаются понять, собственно, необходимость и применимость таких гаджетов в хозяйстве. В общем весьма веселая и легкая для чтения статья.&lt;br&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=996" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="Гаджеты" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_1304300434043604350442044B04_/default.aspx" /><category term="Top" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/Top/default.aspx" /></entry><entry><title>Интервью c Ольгой Дергуновой</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/03/25/c.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/03/25/c.aspx</id><published>2007-03-25T04:44:00Z</published><updated>2007-03-25T04:44:00Z</updated><content type="html">Журнал "Эксперт" провел &lt;A href="http://www.expert.ru/interview/2007/03/22/dergunova"&gt;онлайн-интервью с Ольгой Дергуновой&lt;/A&gt;. Как говорится в анонсе, Ольга Дергунова &lt;BR&gt;
&lt;BLOCKQUOTE style="BORDER-RIGHT:1px dotted;BORDER-TOP:1px dotted;BACKGROUND:gainsboro;BORDER-LEFT:1px dotted;BORDER-BOTTOM:1px dotted;"&gt;рассказала как и почему Microsoft борется с пиратами, как защитить детей от порнографии в интернете, может ли в России появиться свой Билл Гейтс, и почему в семье Ольги 503 человека.&lt;/BLOCKQUOTE&gt;По моему, для IT-менеджеров интервью не будет особо интересным, они и так ориентируются в рассматриваемых вопросах. Интервью скорее получилось ориентированным на частных пользователей. Кроме этого не все вопросы были интересными, а некоторые и того более - странными, вот, например &lt;img src="http://itkazan.com/emoticons/emotion-2.gif" alt="Big Smile" /&gt;: 
&lt;BLOCKQUOTE style="BORDER-RIGHT:1px dotted;BORDER-TOP:1px dotted;BACKGROUND:gainsboro;BORDER-LEFT:1px dotted;BORDER-BOTTOM:1px dotted;"&gt;13. Почему правоохранительные органы, которые живут на средства налогоплательщиков, за деньги граждан РФ должны обеспечивать доход западным компаниям, в частности Microsoft?&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Был вопрос, в общем-то обычный для интервью с IT-менеджерами: 
&lt;BLOCKQUOTE style="BORDER-RIGHT:1px dotted;BORDER-TOP:1px dotted;BACKGROUND:gainsboro;BORDER-LEFT:1px dotted;BORDER-BOTTOM:1px dotted;"&gt;Что вы&amp;nbsp;думаете о&amp;nbsp;перспективах программных продуктов с&amp;nbsp;открытым кодом? Не&amp;nbsp;кажется ли&amp;nbsp;вам, что будущее именно за&amp;nbsp;ПО&amp;nbsp;такого типа?&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/P&gt;&lt;BR&gt;Однако, мне очень понравился ответ Ольги Дергуновой. Я считаю, что он очень правильный. Она сказала, что будущее за теми, кто удержит технологическое лидерство. Отсюда следует, что вряд ли стоит вести ожесточенные споры по поводу OpenSource и проприетарного ПО в принципе. Все должно определяться теми возможностями, которое то или иное ПО предлагает клиентам продукта.&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=972" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="OpenSource" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/OpenSource/default.aspx" /><category term="Интервью" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_18043D0442043504400432044C044E04_/default.aspx" /><category term="Ольга Дергунова" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_1E043B044C0433043004_+_140435044004330443043D043E0432043004_/default.aspx" /><category term="Коммерческое ПО" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_1A043E043C043C04350440044704350441043A043E043504_+_1F041E04_/default.aspx" /></entry><entry><title>6 марта вышел релиз Microsoft Visual Studio 2005 Service Pack 1 (SP1) Update for Windows Vista</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/03/18/6-microsoft-visual-studio-2005-service-pack-1-sp1-update-for-windows-vista.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/03/18/6-microsoft-visual-studio-2005-service-pack-1-sp1-update-for-windows-vista.aspx</id><published>2007-03-18T23:04:00Z</published><updated>2007-03-18T23:04:00Z</updated><content type="html">&lt;P&gt;В общем-то уже запоздалое сообщение &lt;img src="http://www.itkazan.com/emoticons/emotion-1.gif" alt="Smile" /&gt;. &lt;A href="http://www.microsoft.com/presspass/features/2007/mar07/03-06VisualStudio.mspx"&gt;Здесь&lt;/A&gt; можно посмотреть сессию вопросов ответов&amp;nbsp;S. Somasegar. Corporate Vice President, Microsoft Developer Division.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://connect.microsoft.com/content/content.aspx?ContentID=4324&amp;amp;wa=wsignin1.0&amp;amp;siteid=210"&gt;Вот ссылка&lt;/A&gt; на список 398 багов, устранненных в VS 2005 SP1. Описания багов были получены от пользователей VS2005.&lt;/P&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=929" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="Visual Studio 2005 SP1" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/Visual+Studio+2005+SP1/default.aspx" /><category term="Vista" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/Vista/default.aspx" /></entry><entry><title>Top 200 российских деловых женщин</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/03/04/top-200.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/03/04/top-200.aspx</id><published>2007-03-05T02:45:00Z</published><updated>2007-03-05T02:45:00Z</updated><content type="html">&lt;div align="justify"&gt;Журнал &lt;a href="http://www.kariera.idr.ru/"&gt;Карьера&lt;/a&gt; опубликовал рейтинг российских деловых женщин. Оценки проводились экспертами по 11 критериям. Подробнее о критериях и, собственно, сам топ 200 можно посмотреть &lt;a href="http://www.kariera.idr.ru/items/?item=1353"&gt;здесь&lt;/a&gt;. Интересно отметить, что &lt;a href="https://www.microsoft.com/Rus/news/Head/CIS/Dergunova.mspx"&gt;Ольга Дергунова&lt;/a&gt; занимает 20 место, в 2005 и 2006 году она была первой. &lt;a href="http://www.kaspersky.ru/management#NK"&gt;Наталья Касперская&lt;/a&gt; (генеральный директор&amp;nbsp; Лаборатории Касперского) занимает в рейтинге 7 место, как и в 2006 году (10 в 2005). на 90 месте находится Людмила Фатеева - директор департамента маркетинга Майкрософт Рус, так что русский офис Майкрософт представлен сразу двумя женщинами.&lt;/div&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=873" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="top 200" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/top+200/default.aspx" /></entry><entry><title>Дело Поносова закрыто...</title><link rel="alternate" type="text/html" href="http://www.itkazan.com/blogs/alexdemche/archive/2007/02/16/732.aspx" /><id>http://www.itkazan.com/blogs/alexdemche/archive/2007/02/16/732.aspx</id><published>2007-02-16T19:25:00Z</published><updated>2007-02-16T19:25:00Z</updated><content type="html">&lt;div align="left"&gt;Наверное все уже слышали о деле против директора сельской школы, которого обвиняли в использовании нелицензионных копий программ Microsoft в школьных классах. Так вот, "Верещагинский районный суд Пермского края закрыл нашумевшее дело о пиратстве сельского учителя, признав его "малозначительным"".&lt;a href="http://www.3dnews.ru/news/delo_ponosova_zakrito_no_obvinyaemii_ne_soglasen-191328/"&gt;Источник&lt;/a&gt;&lt;br&gt;&lt;p&gt;Интересно, что сам Поносов собирается обжаловать решение суда, так как не согласен с формулировкой постановления: "Получается, что это оправдание не из-за отсутствия состава
преступления, а потому, что ущерб для корпорации Microsoft - это
семечки".&lt;br&gt;Надо сказать, что это дело получило в обществе серьезный резонанс. Об этом деле журналисты уже успели спросить Президента, &lt;a href="http://biz.cnews.ru/news/top/index.shtml?2007/02/06/234444"&gt;Михаил Горбачев написал открытое письмо в Microsoft с просьбой отозвать претензии к Поносову&lt;/a&gt;, &lt;a href="http://biz.cnews.ru/news/line/index.shtml?2007/02/08/234864"&gt;Microsoft ответила на это письмо&lt;/a&gt;, ну и другие известные люди выступили на стороне Поносова, такие как, например, Анатолий Кучерена - юрист, один из членов общественной палаты. Роспечать, кстати, даже пообещала компенсировать нанесенный Microsoft ущерб за&amp;nbsp; счет своих внебюджетных средств.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Интересен ответ Microsoft на письмо Горбачева:&lt;br&gt;"Важно подчеркнуть, что Microsoft не инициировал уголовного
преследования в отношении г-на Поносова, уголовное дело было возбуждено
российскими властями и в соответствии с российским законодательством.
Нам впервые стало известно об этом деле несколько месяцев назад, и,
оценив обстоятельства дела, мы приняли решение не заявлять даже
гражданского иска против г-на Поносова.
В целом, мы не считаем, что дела подобного рода обязательно
должны рассматриваться в уголовном порядке, учитывая малое число
компьютеров и то, что они были приобретены для использования
школьниками.&lt;br&gt;......&lt;br&gt;В подобного рода делах, когда мы сталкиваемся с использованием
пиратского программного обеспечения в школах, Microsoft готов работать
с местными Департаментами образования, чтобы помочь им решить проблему
и лицензировать используемое программное обеспечение без необходимости
привлечения юридических средств защиты прав."&lt;/p&gt;&lt;p&gt;Интересно, есть ли у Microsoft какие-нибудь специальные недорогие подписки на продукты для школ, как, например, для вузов MSDN Academic Alliance. По крайней мере, я думаю, это было бы в их стиле. Да, и, вообще, наверное, Microsoft могла бы разрешить использование своих продуктов в школе, если бы у нее спросили.&lt;br&gt;С другой стороны, если нет денег и не получается договориться, то так уж ли нужны в процессе обучения дорогие продукты Microsoft. Например, в процессе обучения без всякого&amp;nbsp; вреда можно заменить дорогой Office на опенсорсный OpenOffice. А операционную систему покупать вместе с компьютерами (OEM), что в несколько раз дешевле. Кстати, некоторые попытки заменить дорогие продукты на бесплатные в школах произошли на днях в Перми. Акция называлась "Директор может спать спокойно"&lt;img src="http://itkazan.com/emoticons/emotion-2.gif" alt="Big Smile" /&gt;. В ее рамках Пермская гражданская палата и Общество развития предпринимательских
инициатив — предлагают "современный и дешевый способ избежать
«лицензионного скандала» — использовать OpenOffice как альтернативу
Microsoft Office". Впрочем, &lt;a href="http://www.securitylab.ru/news/291005.php"&gt;почитайте сами&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.itkazan.com/aggbug.aspx?PostID=732" width="1" height="1"&gt;</content><author><name>Alexandr Demchenko</name><uri>http://www.itkazan.com/members/Alexandr-Demchenko.aspx</uri></author><category term="интеллектуальная собственность" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_38043D04420435043B043B0435043A044204430430043B044C043D0430044F04_+_41043E04310441044204320435043D043D043E04410442044C04_/default.aspx" /><category term="дело Поносова" scheme="http://www.itkazan.com/blogs/alexdemche/archive/tags/_340435043B043E04_+_1F043E043D043E0441043E0432043004_/default.aspx" /></entry></feed>