От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 11:58 | ||
Оценка: |
От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 14:42 | ||
Оценка: |
Скрытый текст | |
git clone https://github.com/rbhndl/tests.git | |
Скрытый текст | |
asm auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while | |
От: | LaptevVV | ||
Дата: | 29.10.14 14:50 | ||
Оценка: | +1 |
От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 15:47 | ||
Оценка: |
Тесты имеют расширение файла *.mtf.
Для их запуска воспользуйтесь бесплатной версией программы MyTestX 10.2.0.3
http://mytest.klyaksa.net/htm/download/
выбор члена
Напишите выражение использования оператора выбора указателя на член посредством указателя.
pointer->*pointer-to-member
умножение
#Напишите выражение использования оператора умножения.
expr * expr
От: | LaptevVV | ||
Дата: | 29.10.14 16:56 | ||
Оценка: | +1 |
От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 17:37 | ||
Оценка: |
Скрытый текст | |
1. Что определяет класс? Чем обличается класс от объекта? Класс определяет тип (объектов). Объект — экземпляр класса (в памяти). 2. Можно ли объявлять массив объектов? А массив классов? Да. Нет (В метарограммировании — можно: boost::tuple, boost::mpl::vector, ...). 3. Разрешается ли объявлять указатель на объект? А указатель на класс? Да. Нет. 4. Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат? Да: по значению, по указателю, по ссылке. Да, теми же способами (нельзя(т.к. UB) возвращать указатель или ссылку на локальный объект). 5. Как называется использование объекта одного класса в качестве поля другого класса? Композиция. (или все-же Агрегирование?) 6. Является ли структура классом? Чем класс отличается от структуры? Да. У классов по умолчанию private поля и private наследование, у структур — public. 7. Какие ключевые слова в С++ обозначают класс? class, struct. 8. Объясните принцип инкапсуляции. Объединение данных и методов для работы с ними. А также возмможность прятать функции и члены от внешнего использования. 9. Что такое композиция? Тип отношения между объектами, когда один является частью другого (его членом). 10. Для чего используются ключевые слова public и private? Для определения "доступности" определенных частей класса извне. При наследовании class A : public B — A is B; class A : private B — A can use public members of B 11. Можно ли использовать ключевые слова public и private в структуре? Да. 12. Существуют ли ограничения на использование public и private в классе? А в структуре? Нет. 13. Обязательно ли делать поля класса приватными? Нет. 14. Что такое метод? Как вызывается метод? Функция-член класса. a.f() или a->f() или через указатель на функцию член класса: (a.*pf)() или (a->*pf)(). Статический метод обычно вызывают так: A::f() 15. Может ли метод быть приватный? Да. 16. Как определить метод непосредственно внутри класса? А вне класса? Чем эти определения отличаются? class A { void f() {} }; // <=> class A { inline void f() {} }; class A { void f(); }; void A::f() {} 17. Можно в методах присваивать параметрам значения по умолчанию? Да. 18. Что обозначается ключевым словом this? В нестатических методах — указатель на объект у которого этот метод вызван. Тип this: A*, const A* — для const методов, volatile A* — для volatile методов, const volatile A* — для cv-методов 19. Зачем нужны константные методы? Чем отличается определение константного метода от обычного? Чтобы гарантировать вызывающей стороне что состояние объекта не будет изменено. struct A { void cf() const {} }; 20. Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант? Да. Нет. 21. Объясните принцип полиморфизма. Возможность программного кода работать с объектами разных классов одинаковым образом. Различается статический (на этапе компиляции — шаблоны, перегрузка функций и операторов) и динамический (на этапе выполнения — виртуальные функции) полиморфизм. 22. Сколько места в памяти занимает объект класса? Как это узнать? sizeof(Class) 23. Каков размер «пустого» объекта? Complete objects and member subobjects of class type shall have nonzero size. Base class subobjects are not so constrained. 24. Влияют ли методы на размер объекта? Нет. Если есть виртуальные функции, то размер объекта уведичивается засчет указателя на таблицу виртуальных функций. 25. Одинаков ли размер класса и аналогичной структуры? Да. 26. Какие операции нельзя перегружать? Как вы думаете, почему? . .* :: ?: sizeof() typeid() 27. Можно ли перегружать операции для встроенных типов данных? 28. Можно ли при перегрузке изменить приоритет операции? 29. Можно ли определить новую операцию? Нет. Нет. Нет. 30. Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса? При перегрузке операторов как методов класса: 1. Первый параметр оператора опускается (если это бинарный оператор, то прописывается один параметр, если унарный — ничего), этим первым параметром становится экземпляр класса (this). 2. Их можно сделать константными методами. 3. Также при такой перезгрузке имеется доступ к не-public областям. А иначе (при внешней перезгрузке): 1.. Если перезгрузка веншняя, то одним из параметров долна быть пользовательский тип данных (потому как нельзя перегружать операторы для всроенных типов). 2. Такой оператор не может быть константным. 3. Он не имеет доступ к не-public областям, только если он не был обьявлен другом (friend). 31. Какой результат должны возвращать операции с присваиванием? ссылку на объект класса. ( A& operator= ( const A& rhs ) { A(rhs).swap(*this); return *this; } ) 32. Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента? Постфиксная — с параметром типа int, префиксная — без параметров. A & operator++ () { ..increment.. return *this; } // prefix A operator++ (int) { A tmp(*this); ++*this; return tmp; } // postfix 33. Что означает выражение *this? В каких случаях оно используется? см 18, 31, 32. 34. Какие операции не рекомендуется перегружать как методы класса? Почему? operator, ??? — даже не знаю что еще . 35. Какие операции разрешается перегружать только как методы класса? operator=, operator->, operator(), operator[], приведение типа. operator-> обязан иметь в качестве возвращаемого значения struct, class, union или ссылку на это 36. Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется? Дружественная функция имеет доступ к private (и protected) членам класса. class A { int m; friend void f(); }; void f() { ... } 37. Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода. Инициализация класса. Не имеет возвращаемого значения, не может быть статическим, виртуальным, cv, в конструкторе не работает механизм виртуальных функций (т.к. еще не инициализирована таблица виртуальных функций). 38. Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов? Какие виды конструкторов создаются по умолчанию? От 0 до +inf. Да. Конструктор по умолчанию и конструктор копирования (default ctor and copy ctor). 39. Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным? Да. Невозможность создавать экземпляры класса извне (т.е. можно создавать только через статические функции и друзей). 40. Приведите несколько случаев, когда конструктор вызывается неявно. Передача в качестве параметра по значению. Передача в качестве параметра с приведением типа (const ref arg). Возврат из функции по значению. 41. Как проинициализировать динамическую переменную? A * a = new A(...); Либо placement new: A * a = new(ptr_on_block_in_mem) (arguments to constructor); 42. Как объявить константу в классе? Можно ли объявить дробную константу? Вторая часть вопроса — Да. struct A { const int a; A() : a(10) {} }; struct A { static const int a = 10; }; // only const static integral data members can be initialized inside a class or struct struct A { static const int a; }; A::a = 10; struct A { static const double a; }; A::a = 10.; 43. Каким образом разрешается инициализировать константные поля в классе? В списке инициализации. Для static — см 42. При этом, в каждом конструкторе. Замечание: умалчиваемые конструкторы перестают быть доступны. То же касаетя ссылок как полей. 44. В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора? В порядке их объявления. Нет. 45. Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений? ??? Отмечаем порядок. Такое недопустимо: class A { int* a; int* b; A(): b(new int()), a(b) { } }; При выполнении конструктора-деструктора вызовы виртуальных функции не виртуальны. 46. Какой вид конструктора фактически является конструктором преобразования типов? не explicit конструктор с одним аргументом (конструктор инициализации). 47. Для чего нужны функции преобразования? Как объявить такую функцию в классе? Вроде бы это всегда называлось не "функция преобразования", а "оператор приведения типа". Преобразовывать тип к другому. struct A { operator C () {...}; operator B () const {...}; }; 48. Как запретить неявное преобразование типа, выполняемое конструктором инициализации? Перед соответствующим конструктором написать explicit: struct A { explicit A(int) {} }; 49. Какие проблемы могут возникнуть при определении функций преобразования? ??? (видимо нежелательные/сложнопредсказуемые/неожиданные приведения типов) 50. Для чего служит ключевое слово explicit? см 48. 51. Влияет ли наличие целочисленных констант-полей на размер класса? Да. (ессно если не static) 52. Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения? Да. int a[2] = {1, 2}; В классе — никак (за исключением 55). 53. Сколько операндов имеет операция индексирования []? Какой вид результата должна возвращать эта операция? Один. Любой. 54. Для чего нужны статические поля в классе? Как они определяются? Статические поля — переменные класса (нестатические поля — переменные объекта). Определяются — вне класса (за исключением 42 (initialized const static integral data members)): struct A { static int a; }; int A::a; 55. Как объявить в классе и проинициализировать статический константный массив? struct A { static const int a[2]; }; const int A::a[2] = {1, 2}; 56. Что такое выравнивание и от чего оно зависит? Влияет ли выравнивание на размер класса? Implementation defined. Да. 57. Дайте определение контейнера. Containers are objects that store other objects. (см стандарт 2003: стр 465) 58. Какие виды встроенных контейнеров в С++ вы знаете? Sequences : vector, list, deque, queue, stack Associative containers : map, set, multimap, multiset Other : priority_queue, bitset 59. Какие виды доступа к элементам контейнера вам известны? Разыменование итератора, оператор индексирования. 60. Чем отличается прямой доступ от ассоциативного? ??? 61. Перечислите операции, которые обычно реализуются для последовательного доступа к элементам контейнера. begin, end, инкремент итератора 62. Дайте определение итератора. TODO: from GD 63. Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора? Да. Единообразная работа с различными сущностями. 64. Что играет роль итератора для массивов С++? Указатель. 65. Что такое деструктор? Может ли деструктор иметь параметры? Нет. 66. Почему для классов-контейнеров деструктор надо писать явным образом? да вроде незачем или я чего-то не знаю У стандартных классов-контейнеров в стандарте прописано, что должен быть деструктор. 67. Допускается ли перегрузка деструкторов? Нет. 68. Что такое «глубокое копирование» и когда в нем возникает необходимость? Когда при копировании указателя нужно скопировать объект на который он указывает. 69. Какое копирование осуществляет стандартный конструктор копирования? Вызывает конструкторы копирования баз и членов. 70. Чем отличается копирование от присваивания? Это разные операции Копирование — создание одного объекта по другому (с помощью конструктора копирования). Присваивание — изменение содержимого существующего объекта (присваиванием в него содержимого другого объекта). 71. Объясните, почему в операции присваивания требуется проверка присваивания самому себе? Необязательно, например каноническая реализация через swap и конструктор копирования этой проверки не осуществляет (см. 31). 72. Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []? Можно, ей можно передавать нескольео аргументов. 73. Почему необходимо писать два определения операции индексирования? Чем они отличаются? Отличаются наличием const, обычно нужны для того, чтобы была возможность изменять содержимое не const контейнера, и при этом иметь доступ к элементам const контейнера: struct A { T& operator[] (int); const T& operator[] (int) const; }; 74. Дайте определение вложенного класса. struct A { struct NestedClass {}; }; 75. Можно ли класс-итератор реализовать как внешний класс? А как вложенный? В чем отличия этих методов реализации? Да. Да. ???. 76. Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? Да (если я правильно понял вопрос ). 77. Ограничена ли глубина вложенности классов? Нет. 78. Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться? struct A { struct NestedClass; }; struct A::NestedClass {}; Если NestedClass нуждается в определении класса в который он вложен. 79. Каким образом вложенный класс может использовать методы объемлющего класса? А объемлющий — методы вложенного? Каким угодно. (???) 80. Что такое «запредельный» элемент, какую роль он играет в контейнерах? end() — Элемент следующий за последним. Используется в условии окончании перебора элементов (и соответственно возвращается при неудачном поиске в контейнере и аналогичных ситуациях). 81. Объясните, по каким причинам трудно написать универсальный контейнер, элементы которого могут иметь произвольный тип. Из-за строгой типизации (нужен либо VARIANT, либо dynamic_cast). 82. Назовите ключевые слова С++, которые используются для обработки исключений. try, catch, throw 83. Исключение — это: 1) событие; 2) ситуация; 3) объект; 4) ошибка в программе; 5) прерывание; 3) 84. Каким образом исключение генерируется? Происходит раскрутка стека 85. Каковы функции контролируемого блока? Отловить исключения которые сгенериованы внутри него. 86. Что обозначается ключевым словом catch? 1) контролируемый блок; (try-cath) 2) блок обработки исключения; (catch) 3) секция-ловушка; (try) 4) генератор исключения; (throw) 5) обработчик прерывания; (???) 2) 87. Какого типа может быть исключение? Любого. 88. Сколько параметров разрешается писать в заголовке секции-ловушки? Один. 89. Какими способами разрешается передавать исключение в блок обработки? По значению, по ссылке или по указателю. 90. Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки. Использовать несколько блоков обработки. 91. Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку? Можно исполнять dynamic_cast downcasting. Если имелось в виду то что не работают операторы преобразования, то потому что catch-блок хранит информацию о конкретнных типах. TODO: написать подробней и понятней 92. Напишите конструкцию, которая позволяет перехватить любое исключение. catch(...) {} 93. Могут ли контролируемые блоки быть вложенными? Да. 94. Зачем нужен «контролируемый блок-функция» и чем он отличается от обычного контролируемого блока? Нужен для перехвата исключения в списке инициализации конструктора. Обычно используется для преобразования типа исключения (ловится исключение однго типа и кидается другого). catch-блок конструктора не может использовать return; catch-блок конструктора обязан завершиться генерацией исключения и если это не происходит явно, то при выходе из catch-блока происходит вызов "throw;" Пример: class A : B {C c;}; A::A() try : B(...), c(...) { ... } catch (...) { ... } { /*ctor body*/ } 95. Перечислите возможные способы выхода из блока обработки. Нормальный выход. Генерация другого исключения. Повторная генерация исключения: throw;. 96. Каким образом исключение «передать дальше»? throw; 97. Сколько секций-ловушек должно быть задано в контролируемом блоке? 1 .. +inf 98. Что такое «спецификация исключений»? Указание списка исключений, которые может генерировать функция: void f() throw ( const char *, std::logic_error ); // функция может генерировать исключения типа const char *, std::logic_error void f() throw (); // функция не генерирует никакие исключения 99. Что происходит, если функция нарушает спецификацию исключений? Вызов обработчика unexpected 100. Учитывается ли спецификация исключений при перегрузке функций? Спецификация исключений потомка должна не менее "строгой", за исключением того что потомок может генерировать исключения производные от исключений предка. (Т.е. в соответствии с принципом LSP) 101. Что такое «иерархия исключений»? иерархия исключений она и есть иерархия исключений 102. Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений. exception <- logic_error <- domain_error <- invalid_argument <- length_error <- out_of_range <- runtime_error <- range_error <- overflow_error <- underflow_error 103. Поясните «взаимоотношение» исключений и деструкторов. При генерации исключения из-за раскрутки стека вызываются деструкторы локальных объектов. Если в этот момент сгенерируется новое исключение это приведет к вызову terminate() 104. Объясните, зачем может понадобиться подмена стандартных функций завершения. Для собственной обработки подобных ситуаций (обычно для их протоколирования). 105. Какие виды нестандартных исключений вы знаете? bad_typeid, bad_typecast 106. В чем отличие механизма структурной обработки исключений Windows от стандартного механизма? ??? базовому public — is a (наследование интерфейса) private, protected — наследование реализации 111. Какие функции не наследуются? Конструкторы и operator= 112. Сформулируйте правила написания конструкторов в производном классе. ??? 113. Каков порядок вызова конструкторов? А деструкторов? Порядок конструирования объекта: базовые виртуальные классы таблица виртуальных классов базовые классы таблица виртуальных функций члены ("поля") сам класс Деструктор — в обратном порядке. 114. Можно ли в производном классе объявлять новые поля? А методы? Да. Да. 115. Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен? Пользовать BASE::Name 116. Что происходит, если имя метода-наследника совпадает с именем базового метода? Происходит перекрытие имен. Решение — 115. Подстава в том что перекрывается не только совпадающие функции, а вообще все с таким именем. 117. Сформулируйте принцип подстановки. LSP: Subtypes must be substitutable for their base types. 118. Когда выполняется понижающее приведение типов? Когда у программы плохой дизайн 119. Объясните, что такое «срезка» или «расщепление». Это когда какой-нибудь идиот передает объект в функцию, принимающую базовый класс по значению, класс наследник. 120. Объясните, зачем нужны виртуальные функции. Для реализации динамического полиморфизма. 121. Что такое связывание? Определение того какая функция должна быть вызвана. 122. Чем «раннее» связывание отличается от «позднего»? Раннее — на этапе компиляции (разрешение перегрузки), позднее — на этапе выполнения (виртуальные функции). 123. Какие два вида полиморфизма реализованы в С++? Статический и динамический. 124. Дайте определение полиморфного класса. Класс с виртуальными функциями. 125. Может ли виртуальная функция быть дружественной функцией класса? Да. 126. Наследуются ли виртуальные функции? Да. 127. Каковы особенности вызова виртуальных функций в конструкторах и деструкторах? Механизм виртуальных функций не работает. 128. Можно ли сделать виртуальной перегруженную операцию, например, сложение? Да. 129. Может ли конструктор быть виртуальным? А деструктор? Нет. Да. 130. Как виртуальные функции влияют на размер класса? Указателем на таблицу виртуальных функций. 131. Как объявляется «чистая» виртуальная функция? struct A { virtual voif f() = 0; }; 132. Дайте определение абстрактного класса. Класс содержащий хотя бы одну чисто виртуальную функцию. 133. Наследуются ли чистые виртуальные функции? Да. (иначе зачем они нужны ) 134. Можно ли объявить деструктор чисто виртуальным? Да. 135. Чем отличается чистый виртуальный деструктор от чистой виртуальной функции? Он обязан иметь определение. (т.к. будет вызван) 136. Зачем требуется определение чистого виртуального деструктора? Чтобы сделать класс абстрактным. Наверное правильно было бы ответить и на вопрос: 136.(1) Зачем требуется определение виртуального деструктора? Чтобы корректно удалять объекты по указателю на базовый класс. 137. Наследуется ли определение чистой виртуальной функции? Нет. 138. Приведите классификацию целей наследования. Наследование интерфейса и наследование реализации 139. Объясните разницу наследования интерфейса от наследования реализации. 140. Назовите причины, требующие разделения программ на части. Удобней использовать. 141. Дайте определение термина «единица трансляции»? (Transalation unit) Исходный файл (cpp, cxx, C, ...) c подключенными заголовочными файлами и другими файлами подключенными с помощью include. 142. Чем отличается файл с исходным текстом от единицы трансляции? Файл с исходным текстом не обязательно является единицей трансляции. 143. Существуют ли в С++ конструкции, позволяющие идентифицировать отдельный модуль? ??? (подразумевается namespace?) 144. Какие способы сборки программы вы можете назвать? Полная, частичная. 145. Что такое «объектный модуль»? Программа, которая «собирает» объектные модули в программу, называется _____________ ? .obj. Линковщик (linker). 146. В чем заключается отличие аргумента «файл» от <файл> в директиве #include? Локальные и глобальные инклуды (т.е. логическое разделение). Отличается тем где компилятор пытается найти подключаемый файл в первую очередь. 147. Что такое ODR? One Definition Rule (Правило Одного Определения). 148. Объясните, что такое «страж» включения и зачем он нужен. В .h файлах, для того чтобы избежать повторного подключения пишут: <blah_blah_blah.h>: #ifndef BLAH_BLAH_BLAH__ #define BLAH_BLAH_BLAH__ ... #endif // BLAH_BLAH_BLAH__ 149. Является ли интерфейс класса его определением? Да. 150. Сколько определений класса может быть в единице трансляции? Одно. 151. Сколько определений класса может быть в многофайловой программе? Много. 152. Чем отличаются стандартные заголовки <string>, <string.h> и <cstring>? STL. CRT. CRT. 153. Объясните суть идиомы Pimpl. В классе хранится указатель на реализацию, реализация которого скрыта от пользователя (есть только forward definition). Методы класса реализованы посредством класса реализации. 154. Что такое делегирование и как его можно использовать для повышения степени инкапсуляции? 155. Каким образом глобальную переменную, определенную в одной единице трансляции, сделать доступной в другой единице трансляции? А константу? extern 156. Можно ли использовать слово extern при объявлении функций? можно 157. Как локализовать объявление функции в файле? использовать static или неименованные пространства имен 158. Чем отличается «внешнее» связывание от «внутреннего» связывания? возможностью доступноступа извне 159. Что такое «спецификации компоновки»? 160. Какие объекты обладают внутренним связыванием по умолчанию? 161. Какие области видимости имен вы знаете? Глобальные и нет. 162. Для чего используются пространства имен? Для удобства (логическое выделение части функциональности). Для избежания конфликтов имен. 163. Чем отличаются именованные и неименованные пространства имен? 164. Могут ли пространства имен быть вложенными? Да. 165. Для чего применяются алиасы пространства имен? Для удобства. Для избежания конфликтов имен. 166. Как сделать члены пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта? uses namespace a; // ??? 167. Объясните разницу между статической и динамической инициализацией. Инициализация статических переменных происходит до вызова main. Инициализация статических переменных определенных внутри функции происходит не позже их первого использования. 168. В чем состоит проблема инициализации глобальных статических переменных? В том, что порядок инициализации не известен. 169. Какие элементы класса можно объявлять статическими? Методы, функции-члены, операторы. (за искл 175) 170. Можно ли объявить в классе статическую константу? А константный статический массив? Да. Да. (см. 42, 52) 171. А какие статические поля можно инициализировать непосредственно в классе? only const static integral data members 172. Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей? struct A { static int sa; }; До вызова main (см. 167) 173. Сколько места в классе занимают статические поля ? 0 174. Чем отличается статический метод от обычного? Нету this 175. Какие методы класса не могут быть статическими? Операторы, которые должны быть non-static (см. 35), конструкторы и деструкторы, виртуальные функции. 176. Какие применения статических полей вы можете привести? А каким образом применяются статические методы? Пример: контроль создания объектов класса: private ctor, static счетчик объектов, статик функция, создающая объекты. 177. Приведите структуру и принцип действия паттерна Singleton. Есть разные реализации синглетона (общая проблема — время жизни). template < class T > struct SingletonT : public T { static T & inst() { T t; return t; } private: /*ctor, copy ctor, assignment*/ }; 178. Для чего предназначены шаблоны? Изначально — для того чтобы не писать одинаковый код для разных типов. Потом появилось еще и метарограммирование с использованием шаблонов. 179. Какие виды шаблонов в С++ вы знаете? Шаблоны классов и шаблоны функций. 180. Объясните термин «инстанцирование шаблона». Подстановка реальных типов в качестве аргументов шаблона. 181. В чем разница между определением и объявлением шаблона? template < class T > struct TA; // declaration template < class T > struct TA { T a; }; // definiftion 182. Объясните назначение ключевого слова typename. В списке параметров шаблона может использоваться как синоним "class" Внутри шаблона используется для указания компилятору вложенного типа типа зависящего от параметра шаблона: template < class T > struct TA { typedef typename T::iterator type; }; // без typename — ошибка компиляции 183. Какие виды параметров разрешается задавать в шаблоне класса? А в шаблоне функции? ... 184. Можно ли параметрам шаблона присваивать значения по умолчанию? Да. 185. Может ли параметром шаблона быть другой шаблон? Каковы особенности объявления параметра-шаблона? Да: template < template <class> class TT > TA { TT<int> m; }; 186. Что такое специализация шаблона? Объясните разницу между полной и частичной специализацией. Это частный случай некоторого шаблона при фиксированной части аргументов. Полная специализация — все аргументы фиксированы. Пример: template < class T, class U > struct TA {}; // Primary template template < class T > struct TA<T, int> {}; // Partial specialization template <> struct TA<int, int> {}; // Explicit specialization 187. Разрешается ли специализировать шаблон функции? Разрешается только полная специализация, т.к. частичная — суть перегрузка. 188. Может ли класс-шаблон быть вложенным в другой класс-шаблон? А в обычный класс? Да. Да. 189. Можно ли объявить в классе шаблонный метод? А шаблонный конструктор? Да. Да. 190. Можно ли перегружать функцию-шаблон? Да. 191. Какие параметры функции-шаблона выводятся автоматически? Не dependent types. 192. Может ли шаблон класса быть наследником обычного класса? А обычный класс от шаблона? Да. ???. 193. Объясните, что такое класс свойств (класс трактовок). traits — вспомогательный шаблонный класс который содержит вложенные типы и статические функции соответсвующие данному типу (предназначенные для работы с ним). 194. Каким образом можно использовать возможность наследования обычного класса от шаблона? ??? 195. Может ли шаблонный конструктор быть конструктором по умолчанию? Нет. 196. Для чего применяются директивы явного инстанцирования? Дл того чтобы соответствующая инстанциация была скомпилирована/слинкована. 197. Объясните, в чем состоят проблемы, возникающие при разделении шаблонного класса на интерфейс и реализацию? Реализация не может быть вынесена в .cpp файл. (т.к. экспорт шаблонов не поддерживается большей частью компиляторов) 198. Что такое «модель явного инстанцирования» и как она работает? Реализация вынесена в .cpp файл и есть явно инстанциация для нужных типов. 199. Может ли шаблонный класс иметь «друзей»? Да. 200. Какие проблемы возникают при объявлении дружественной функции для класса-шаблона? 201. Разрешается ли определять в классе-шаблоне статические поля? А статические методы? Да. Да. 202. Что такое «инициализация нулем»? (zero-initialization) объект инициализируется значением 0 (преобразованное в тип объекта). Инициализация по умолчанию POD типов производит инициализацию нулями. Для стсатических переменных встроенных типов производиться инициализация нулямию | |
От: | LaptevVV | ||
Дата: | 29.10.14 18:55 | ||
Оценка: |
Скрытый текст | |
V>1. Что определяет класс? Чем обличается класс от объекта? V>Класс определяет тип (объектов). Объект — экземпляр класса (в памяти). V>2. Можно ли объявлять массив объектов? А массив классов? V>Да. Нет (В метарограммировании — можно: boost::tuple, boost::mpl::vector, ...). V>3. Разрешается ли объявлять указатель на объект? А указатель на класс? V>Да. Нет. V>4. Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат? V>Да: по значению, по указателю, по ссылке. Да, теми же способами (нельзя(т.к. UB) возвращать указатель или ссылку на локальный объект). V>5. Как называется использование объекта одного класса в качестве поля другого класса? V>Композиция. (или все-же Агрегирование?) V>6. Является ли структура классом? Чем класс отличается от структуры? V>Да. У классов по умолчанию private поля и private наследование, у структур — public. V>7. Какие ключевые слова в С++ обозначают класс? V>class, struct. V>8. Объясните принцип инкапсуляции. V>Объединение данных и методов для работы с ними. А также возмможность прятать функции и члены от внешнего использования. V>9. Что такое композиция? V>Тип отношения между объектами, когда один является частью другого (его членом). V>10. Для чего используются ключевые слова public и private? V>Для определения "доступности" определенных частей класса извне. V>При наследовании class A : public B — A is B; class A : private B — A can use public members of B V>11. Можно ли использовать ключевые слова public и private в структуре? V>Да. V>12. Существуют ли ограничения на использование public и private в классе? А в структуре? V>Нет. V>13. Обязательно ли делать поля класса приватными? V>Нет. V>14. Что такое метод? Как вызывается метод? V>Функция-член класса. a.f() или a->f() или через указатель на функцию член класса: (a.*pf)() или (a->*pf)(). V>Статический метод обычно вызывают так: A::f() V>15. Может ли метод быть приватный? V>Да. V>16. Как определить метод непосредственно внутри класса? А вне класса? Чем эти определения отличаются? V>class A { void f() {} }; // <=> class A { inline void f() {} }; V>class A { void f(); }; void A::f() {} V>17. Можно в методах присваивать параметрам значения по умолчанию? V>Да. V>18. Что обозначается ключевым словом this? V>В нестатических методах — указатель на объект у которого этот метод вызван. V>Тип this: A*, const A* — для const методов, volatile A* — для volatile методов, const volatile A* — для cv-методов V>19. Зачем нужны константные методы? Чем отличается определение константного метода от обычного? V>Чтобы гарантировать вызывающей стороне что состояние объекта не будет изменено. V>struct A { void cf() const {} }; V>20. Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант? V>Да. Нет. V>21. Объясните принцип полиморфизма. V>Возможность программного кода работать с объектами разных классов одинаковым образом. V>Различается статический (на этапе компиляции — шаблоны, перегрузка функций и операторов) V>и динамический (на этапе выполнения — виртуальные функции) полиморфизм. V>22. Сколько места в памяти занимает объект класса? Как это узнать? V>sizeof(Class) V>23. Каков размер «пустого» объекта? V>Complete objects and member subobjects of class type shall have nonzero size. Base class subobjects are not so constrained. V>24. Влияют ли методы на размер объекта? V>Нет. Если есть виртуальные функции, то размер объекта уведичивается засчет указателя на таблицу виртуальных функций. V>25. Одинаков ли размер класса и аналогичной структуры? V>Да. V>26. Какие операции нельзя перегружать? Как вы думаете, почему? V>. .* :: ?: sizeof() typeid() V>27. Можно ли перегружать операции для встроенных типов данных? V>28. Можно ли при перегрузке изменить приоритет операции? V>29. Можно ли определить новую операцию? V>Нет. Нет. Нет. V>30. Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса? V>При перегрузке операторов как методов класса: V>1. Первый параметр оператора опускается (если это бинарный оператор, то прописывается один параметр, если унарный — ничего), этим первым параметром становится экземпляр класса (this). V>2. Их можно сделать константными методами. V>3. Также при такой перезгрузке имеется доступ к не-public областям. V>А иначе (при внешней перезгрузке): V>1.. Если перезгрузка веншняя, то одним из параметров долна быть пользовательский тип данных (потому как нельзя перегружать операторы для всроенных типов). V>2. Такой оператор не может быть константным. V>3. Он не имеет доступ к не-public областям, только если он не был обьявлен другом (friend). V>31. Какой результат должны возвращать операции с присваиванием? V>ссылку на объект класса. ( A& operator= ( const A& rhs ) { A(rhs).swap(*this); return *this; } ) V>32. Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента? V>Постфиксная — с параметром типа int, префиксная — без параметров. V> A & operator++ () { ..increment.. return *this; } // prefix V> A operator++ (int) { A tmp(*this); ++*this; return tmp; } // postfix V>33. Что означает выражение *this? В каких случаях оно используется? V>см 18, 31, 32. V>34. Какие операции не рекомендуется перегружать как методы класса? Почему? V>operator, V>??? — даже не знаю что еще . V>35. Какие операции разрешается перегружать только как методы класса? V>operator=, operator->, operator(), operator[], приведение типа. V>operator-> обязан иметь в качестве возвращаемого значения struct, class, union или ссылку на это V>36. Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется? V>Дружественная функция имеет доступ к private (и protected) членам класса. V>class A { int m; friend void f(); }; void f() { ... } V>37. Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода. V>Инициализация класса. Не имеет возвращаемого значения, не может быть статическим, виртуальным, cv, V>в конструкторе не работает механизм виртуальных функций (т.к. еще не инициализирована таблица виртуальных функций). V>38. Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов? Какие виды конструкторов создаются по умолчанию? V>От 0 до +inf. Да. Конструктор по умолчанию и конструктор копирования (default ctor and copy ctor). V>39. Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным? V>Да. Невозможность создавать экземпляры класса извне (т.е. можно создавать только через статические функции и друзей). V>40. Приведите несколько случаев, когда конструктор вызывается неявно. V>Передача в качестве параметра по значению. V>Передача в качестве параметра с приведением типа (const ref arg). V>Возврат из функции по значению. V>41. Как проинициализировать динамическую переменную? V>A * a = new A(...); V>Либо placement new: V>A * a = new(ptr_on_block_in_mem) (arguments to constructor); V>42. Как объявить константу в классе? Можно ли объявить дробную константу? V>Вторая часть вопроса — Да. V>struct A { const int a; A() : a(10) {} }; V>struct A { static const int a = 10; }; // only const static integral data members can be initialized inside a class or struct V>struct A { static const int a; }; A::a = 10; V>struct A { static const double a; }; A::a = 10.; V>43. Каким образом разрешается инициализировать константные поля в классе? V>В списке инициализации. Для static — см 42. При этом, в каждом конструкторе. Замечание: умалчиваемые конструкторы V>перестают быть доступны. То же касаетя ссылок как полей. V>44. В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора? V>В порядке их объявления. Нет. V>45. Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений? V>??? Отмечаем порядок. Такое недопустимо: V>class A V>{ V> int* a; V> int* b; V> A(): b(new int()), a(b) V> { V> } V>}; V>При выполнении конструктора-деструктора вызовы виртуальных функции не V>виртуальны. V>46. Какой вид конструктора фактически является конструктором преобразования типов? V>не explicit конструктор с одним аргументом (конструктор инициализации). V>47. Для чего нужны функции преобразования? Как объявить такую функцию в классе? V>Вроде бы это всегда называлось не "функция преобразования", а "оператор приведения типа". V>Преобразовывать тип к другому. struct A { operator C () {...}; operator B () const {...}; }; V>48. Как запретить неявное преобразование типа, выполняемое конструктором инициализации? V>Перед соответствующим конструктором написать explicit: struct A { explicit A(int) {} }; V>49. Какие проблемы могут возникнуть при определении функций преобразования? V>??? (видимо нежелательные/сложнопредсказуемые/неожиданные приведения типов) V>50. Для чего служит ключевое слово explicit? V>см 48. V>51. Влияет ли наличие целочисленных констант-полей на размер класса? V>Да. (ессно если не static) V>52. Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения? V>Да. V>int a[2] = {1, 2}; В классе — никак (за исключением 55). V>53. Сколько операндов имеет операция индексирования []? Какой вид результата должна возвращать эта операция? V>Один. Любой. V>54. Для чего нужны статические поля в классе? Как они определяются? V>Статические поля — переменные класса (нестатические поля — переменные объекта). V>Определяются — вне класса (за исключением 42 (initialized const static integral data members)): V>struct A { static int a; }; int A::a; V>55. Как объявить в классе и проинициализировать статический константный массив? V>struct A { static const int a[2]; }; const int A::a[2] = {1, 2}; V>56. Что такое выравнивание и от чего оно зависит? Влияет ли выравнивание на размер класса? V>Implementation defined. Да. V>57. Дайте определение контейнера. V>Containers are objects that store other objects. (см стандарт 2003: стр 465) V>58. Какие виды встроенных контейнеров в С++ вы знаете? V>Sequences : vector, list, deque, queue, stack V>Associative containers : map, set, multimap, multiset V>Other : priority_queue, bitset V>59. Какие виды доступа к элементам контейнера вам известны? V>Разыменование итератора, оператор индексирования. V>60. Чем отличается прямой доступ от ассоциативного? V>??? V>61. Перечислите операции, которые обычно реализуются для последовательного доступа к элементам контейнера. V>begin, end, инкремент итератора V>62. Дайте определение итератора. V>TODO: from GD V>63. Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора? V>Да. Единообразная работа с различными сущностями. V>64. Что играет роль итератора для массивов С++? V>Указатель. V>65. Что такое деструктор? Может ли деструктор иметь параметры? V>Нет. V>66. Почему для классов-контейнеров деструктор надо писать явным образом? V>да вроде незачем или я чего-то не знаю V>У стандартных классов-контейнеров в стандарте прописано, что должен быть деструктор. V>67. Допускается ли перегрузка деструкторов? V>Нет. V>68. Что такое «глубокое копирование» и когда в нем возникает необходимость? V>Когда при копировании указателя нужно скопировать объект на который он указывает. V>69. Какое копирование осуществляет стандартный конструктор копирования? V>Вызывает конструкторы копирования баз и членов. V>70. Чем отличается копирование от присваивания? V>Это разные операции V>Копирование — создание одного объекта по другому (с помощью конструктора копирования). V>Присваивание — изменение содержимого существующего объекта (присваиванием в него содержимого другого объекта). V>71. Объясните, почему в операции присваивания требуется проверка присваивания самому себе? V>Необязательно, например каноническая реализация через swap и конструктор копирования этой проверки не осуществляет (см. 31). V>72. Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []? V>Можно, ей можно передавать нескольео аргументов. V>73. Почему необходимо писать два определения операции индексирования? Чем они отличаются? V>Отличаются наличием const, обычно нужны для того, чтобы была возможность изменять содержимое не const контейнера, V>и при этом иметь доступ к элементам const контейнера: V>struct A V>{ V> T& operator[] (int); V> const T& operator[] (int) const; V>}; V>74. Дайте определение вложенного класса. V>struct A { struct NestedClass {}; }; V>75. Можно ли класс-итератор реализовать как внешний класс? А как вложенный? В чем отличия этих методов реализации? V>Да. Да. ???. V>76. Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? V>Да (если я правильно понял вопрос ). V>77. Ограничена ли глубина вложенности классов? V>Нет. V>78. Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться? V>struct A { struct NestedClass; }; struct A::NestedClass {}; V>Если NestedClass нуждается в определении класса в который он вложен. V>79. Каким образом вложенный класс может использовать методы объемлющего класса? А объемлющий — методы вложенного? V>Каким угодно. (???) V>80. Что такое «запредельный» элемент, какую роль он играет в контейнерах? V>end() — Элемент следующий за последним. Используется в условии окончании перебора элементов (и соответственно возвращается при неудачном поиске в контейнере и аналогичных ситуациях). V>81. Объясните, по каким причинам трудно написать универсальный контейнер, элементы которого могут иметь произвольный тип. V>Из-за строгой типизации (нужен либо VARIANT, либо dynamic_cast). V>82. Назовите ключевые слова С++, которые используются для обработки исключений. V>try, catch, throw V>83. Исключение — это: V>1) событие; V>2) ситуация; V>3) объект; V>4) ошибка в программе; V>5) прерывание; V>3) V>84. Каким образом исключение генерируется? V>Происходит раскрутка стека V>85. Каковы функции контролируемого блока? V>Отловить исключения которые сгенериованы внутри него. V>86. Что обозначается ключевым словом catch? V>1) контролируемый блок; (try-cath) V>2) блок обработки исключения; (catch) V>3) секция-ловушка; (try) V>4) генератор исключения; (throw) V>5) обработчик прерывания; (???) V>2) V>87. Какого типа может быть исключение? V>Любого. V>88. Сколько параметров разрешается писать в заголовке секции-ловушки? V>Один. V>89. Какими способами разрешается передавать исключение в блок обработки? V>По значению, по ссылке или по указателю. V>90. Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки. V>Использовать несколько блоков обработки. V>91. Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку? V>Можно исполнять dynamic_cast downcasting. V>Если имелось в виду то что не работают операторы преобразования, то потому что catch-блок хранит информацию о конкретнных типах. V>TODO: написать подробней и понятней V>92. Напишите конструкцию, которая позволяет перехватить любое исключение. V>catch(...) {} V>93. Могут ли контролируемые блоки быть вложенными? V>Да. V>94. Зачем нужен «контролируемый блок-функция» и чем он отличается от обычного контролируемого блока? V>Нужен для перехвата исключения в списке инициализации конструктора. Обычно используется для преобразования типа исключения (ловится исключение однго типа и кидается другого). V>catch-блок конструктора не может использовать return; catch-блок конструктора обязан завершиться генерацией исключения и если это не происходит явно, то при выходе из catch-блока происходит вызов "throw;" V>Пример: V>class A : B {C c;}; V>A::A() V>try : B(...), c(...) V>{ V>... V>} catch (...) { ... } V>{ /*ctor body*/ } V>95. Перечислите возможные способы выхода из блока обработки. V>Нормальный выход. Генерация другого исключения. Повторная генерация исключения: throw;. V>96. Каким образом исключение «передать дальше»? V>throw; V>97. Сколько секций-ловушек должно быть задано в контролируемом блоке? V>1 .. +inf V>98. Что такое «спецификация исключений»? V>Указание списка исключений, которые может генерировать функция: V>void f() throw ( const char *, std::logic_error ); // функция может генерировать исключения типа const char *, std::logic_error V>void f() throw (); // функция не генерирует никакие исключения V>99. Что происходит, если функция нарушает спецификацию исключений? V>Вызов обработчика unexpected V>100. Учитывается ли спецификация исключений при перегрузке функций? V>Спецификация исключений потомка должна не менее "строгой", V>за исключением того что потомок может генерировать исключения производные от исключений предка. V>(Т.е. в соответствии с принципом LSP) V>101. Что такое «иерархия исключений»? V>иерархия исключений она и есть иерархия исключений V>102. Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений. V>exception <- logic_error <- domain_error V> <- invalid_argument V> <- length_error V> <- out_of_range V> <- runtime_error <- range_error V> <- overflow_error V> <- underflow_error V>103. Поясните «взаимоотношение» исключений и деструкторов. V>При генерации исключения из-за раскрутки стека вызываются деструкторы локальных объектов. V>Если в этот момент сгенерируется новое исключение это приведет к вызову terminate() V>104. Объясните, зачем может понадобиться подмена стандартных функций завершения. V>Для собственной обработки подобных ситуаций (обычно для их протоколирования). V>105. Какие виды нестандартных исключений вы знаете? V>bad_typeid, bad_typecast V>106. В чем отличие механизма структурной обработки исключений Windows от стандартного механизма? V>??? V>базовому V>public — is a (наследование интерфейса) V>private, protected — наследование реализации V>111. Какие функции не наследуются? V>Конструкторы и operator= V>112. Сформулируйте правила написания конструкторов в производном классе. V>??? V>113. Каков порядок вызова конструкторов? А деструкторов? V>Порядок конструирования объекта: V>базовые виртуальные классы V>таблица виртуальных классов V>базовые классы V>таблица виртуальных функций V>члены ("поля") V>сам класс V>Деструктор — в обратном порядке. V>114. Можно ли в производном классе объявлять новые поля? А методы? V>Да. Да. V>115. Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен? V>Пользовать BASE::Name V>116. Что происходит, если имя метода-наследника совпадает с именем базового метода? V>Происходит перекрытие имен. Решение — 115. V>Подстава в том что перекрывается не только совпадающие функции, а вообще все с таким именем. V>117. Сформулируйте принцип подстановки. V>LSP: Subtypes must be substitutable for their base types. V>118. Когда выполняется понижающее приведение типов? V>Когда у программы плохой дизайн V>119. Объясните, что такое «срезка» или «расщепление». V>Это когда какой-нибудь идиот передает объект в функцию, принимающую базовый класс по значению, класс наследник. V>120. Объясните, зачем нужны виртуальные функции. V>Для реализации динамического полиморфизма. V>121. Что такое связывание? V>Определение того какая функция должна быть вызвана. V>122. Чем «раннее» связывание отличается от «позднего»? V>Раннее — на этапе компиляции (разрешение перегрузки), позднее — на этапе выполнения (виртуальные функции). V>123. Какие два вида полиморфизма реализованы в С++? V>Статический и динамический. V>124. Дайте определение полиморфного класса. V>Класс с виртуальными функциями. V>125. Может ли виртуальная функция быть дружественной функцией класса? V>Да. V>126. Наследуются ли виртуальные функции? V>Да. V>127. Каковы особенности вызова виртуальных функций в конструкторах и деструкторах? V>Механизм виртуальных функций не работает. V>128. Можно ли сделать виртуальной перегруженную операцию, например, сложение? V>Да. V>129. Может ли конструктор быть виртуальным? А деструктор? V>Нет. Да. V>130. Как виртуальные функции влияют на размер класса? V>Указателем на таблицу виртуальных функций. V>131. Как объявляется «чистая» виртуальная функция? V>struct A { virtual voif f() = 0; }; V>132. Дайте определение абстрактного класса. V>Класс содержащий хотя бы одну чисто виртуальную функцию. V>133. Наследуются ли чистые виртуальные функции? V>Да. (иначе зачем они нужны ) V>134. Можно ли объявить деструктор чисто виртуальным? V>Да. V>135. Чем отличается чистый виртуальный деструктор от чистой виртуальной функции? V>Он обязан иметь определение. (т.к. будет вызван) V>136. Зачем требуется определение чистого виртуального деструктора? V>Чтобы сделать класс абстрактным. V>Наверное правильно было бы ответить и на вопрос: V>136.(1) Зачем требуется определение виртуального деструктора? V>Чтобы корректно удалять объекты по указателю на базовый класс. V>137. Наследуется ли определение чистой виртуальной функции? V>Нет. V>138. Приведите классификацию целей наследования. V>Наследование интерфейса и наследование реализации V>139. Объясните разницу наследования интерфейса от наследования реализации. V>140. Назовите причины, требующие разделения программ на части. V>Удобней использовать. V>141. Дайте определение термина «единица трансляции»? V>(Transalation unit) V>Исходный файл (cpp, cxx, C, ...) c подключенными заголовочными файлами V>и другими файлами подключенными с помощью include. V>142. Чем отличается файл с исходным текстом от единицы трансляции? V>Файл с исходным текстом не обязательно является единицей трансляции. V>143. Существуют ли в С++ конструкции, позволяющие идентифицировать отдельный модуль? V>??? (подразумевается namespace?) V>144. Какие способы сборки программы вы можете назвать? V>Полная, частичная. V>145. Что такое «объектный модуль»? Программа, которая «собирает» объектные модули в программу, называется _____________ ? V>.obj. Линковщик (linker). V>146. В чем заключается отличие аргумента «файл» от <файл> в директиве #include? V>Локальные и глобальные инклуды (т.е. логическое разделение). V>Отличается тем где компилятор пытается найти подключаемый файл в первую очередь. V>147. Что такое ODR? V>One Definition Rule (Правило Одного Определения). V>148. Объясните, что такое «страж» включения и зачем он нужен. V>В .h файлах, для того чтобы избежать повторного подключения пишут: V><blah_blah_blah.h>: V>#ifndef BLAH_BLAH_BLAH__ V>#define BLAH_BLAH_BLAH__ V>... V>#endif // BLAH_BLAH_BLAH__ V>149. Является ли интерфейс класса его определением? V>Да. V>150. Сколько определений класса может быть в единице трансляции? V>Одно. V>151. Сколько определений класса может быть в многофайловой программе? V>Много. V>152. Чем отличаются стандартные заголовки <string>, <string.h> и <cstring>? V>STL. CRT. CRT. V>153. Объясните суть идиомы Pimpl. V>В классе хранится указатель на реализацию, реализация которого скрыта от пользователя (есть только forward definition). V>Методы класса реализованы посредством класса реализации. V>154. Что такое делегирование и как его можно использовать для повышения степени инкапсуляции? V>155. Каким образом глобальную переменную, определенную в одной единице трансляции, сделать доступной в другой единице трансляции? А константу? V>extern V>156. Можно ли использовать слово extern при объявлении функций? V>можно V>157. Как локализовать объявление функции в файле? V>использовать static или неименованные пространства имен V>158. Чем отличается «внешнее» связывание от «внутреннего» связывания? V>возможностью доступноступа извне V>159. Что такое «спецификации компоновки»? V>160. Какие объекты обладают внутренним связыванием по умолчанию? V>161. Какие области видимости имен вы знаете? V>Глобальные и нет. V>162. Для чего используются пространства имен? V>Для удобства (логическое выделение части функциональности). Для избежания конфликтов имен. V>163. Чем отличаются именованные и неименованные пространства имен? V>164. Могут ли пространства имен быть вложенными? V>Да. V>165. Для чего применяются алиасы пространства имен? V>Для удобства. Для избежания конфликтов имен. V>166. Как сделать члены пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта? V>uses namespace a; // ??? V>167. Объясните разницу между статической и динамической инициализацией. V>Инициализация статических переменных происходит до вызова main. V>Инициализация статических переменных определенных внутри функции происходит не позже их первого использования. V>168. В чем состоит проблема инициализации глобальных статических переменных? V>В том, что порядок инициализации не известен. V>169. Какие элементы класса можно объявлять статическими? V>Методы, функции-члены, операторы. (за искл 175) V>170. Можно ли объявить в классе статическую константу? А константный статический массив? V>Да. Да. (см. 42, 52) V>171. А какие статические поля можно инициализировать непосредственно в классе? V>only const static integral data members V>172. Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей? V>struct A { static int sa; }; V>До вызова main (см. 167) V>173. Сколько места в классе занимают статические поля ? V>0 V>174. Чем отличается статический метод от обычного? V>Нету this V>175. Какие методы класса не могут быть статическими? V>Операторы, которые должны быть non-static (см. 35), конструкторы и деструкторы, виртуальные функции. V>176. Какие применения статических полей вы можете привести? А каким образом применяются статические методы? V>Пример: контроль создания объектов класса: private ctor, static счетчик объектов, статик функция, создающая объекты. V>177. Приведите структуру и принцип действия паттерна Singleton. V>Есть разные реализации синглетона (общая проблема — время жизни). V>template < class T > struct SingletonT : public T { static T & inst() { T t; return t; } private: /*ctor, copy ctor, assignment*/ }; V>178. Для чего предназначены шаблоны? V>Изначально — для того чтобы не писать одинаковый код для разных типов. V>Потом появилось еще и метарограммирование с использованием шаблонов. V>179. Какие виды шаблонов в С++ вы знаете? V>Шаблоны классов и шаблоны функций. V>180. Объясните термин «инстанцирование шаблона». V>Подстановка реальных типов в качестве аргументов шаблона. V>181. В чем разница между определением и объявлением шаблона? V>template < class T > struct TA; // declaration V>template < class T > struct TA { T a; }; // definiftion V>182. Объясните назначение ключевого слова typename. V>В списке параметров шаблона может использоваться как синоним "class" V>Внутри шаблона используется для указания компилятору вложенного типа типа зависящего от параметра шаблона: V>template < class T > struct TA { typedef typename T::iterator type; }; // без typename — ошибка компиляции V>183. Какие виды параметров разрешается задавать в шаблоне класса? А в шаблоне функции? V>... V>184. Можно ли параметрам шаблона присваивать значения по умолчанию? V>Да. V>185. Может ли параметром шаблона быть другой шаблон? Каковы особенности объявления параметра-шаблона? V>Да: template < template <class> class TT > TA { TT<int> m; }; V>186. Что такое специализация шаблона? Объясните разницу между полной и частичной специализацией. V>Это частный случай некоторого шаблона при фиксированной части аргументов. Полная специализация — все аргументы фиксированы. V>Пример: V>template < class T, class U > struct TA {}; // Primary template V>template < class T > struct TA<T, int> {}; // Partial specialization V>template <> struct TA<int, int> {}; // Explicit specialization V>187. Разрешается ли специализировать шаблон функции? V>Разрешается только полная специализация, т.к. частичная — суть перегрузка. V>188. Может ли класс-шаблон быть вложенным в другой класс-шаблон? А в обычный класс? V>Да. Да. V>189. Можно ли объявить в классе шаблонный метод? А шаблонный конструктор? V>Да. Да. V>190. Можно ли перегружать функцию-шаблон? V>Да. V>191. Какие параметры функции-шаблона выводятся автоматически? V>Не dependent types. V>192. Может ли шаблон класса быть наследником обычного класса? А обычный класс от шаблона? V>Да. ???. V>193. Объясните, что такое класс свойств (класс трактовок). V>traits — вспомогательный шаблонный класс который содержит вложенные типы и статические функции соответсвующие данному типу (предназначенные для работы с ним). V>194. Каким образом можно использовать возможность наследования обычного класса от шаблона? V>??? V>195. Может ли шаблонный конструктор быть конструктором по умолчанию? V>Нет. V>196. Для чего применяются директивы явного инстанцирования? V>Дл того чтобы соответствующая инстанциация была скомпилирована/слинкована. V>197. Объясните, в чем состоят проблемы, возникающие при разделении шаблонного класса на интерфейс и реализацию? V>Реализация не может быть вынесена в .cpp файл. (т.к. экспорт шаблонов не поддерживается большей частью компиляторов) V>198. Что такое «модель явного инстанцирования» и как она работает? V>Реализация вынесена в .cpp файл и есть явно инстанциация для нужных типов. V>199. Может ли шаблонный класс иметь «друзей»? V>Да. V>200. Какие проблемы возникают при объявлении дружественной функции для класса-шаблона? V>201. Разрешается ли определять в классе-шаблоне статические поля? А статические методы? V>Да. Да. V>202. Что такое «инициализация нулем»? V>(zero-initialization) объект инициализируется значением 0 (преобразованное в тип объекта). V>Инициализация по умолчанию POD типов производит инициализацию нулями. V>Для стсатических переменных встроенных типов производиться инициализация нулямию | |
От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 19:17 | ||
Оценка: |
От: | vpchelko | ||
Дата: | 29.10.14 19:56 | ||
Оценка: |
Скрытый текст | |
V>Везде одна и та же проблема, начиная от образования и кончая наймом кандидатов. V> ОбразованиеV>1. Преподаватель может обучать плохо — неумелый преподаватель. V>2. Ученик может плохо учиться — ленивый ученик. V>3. Ученик не смог сдать предмет экзаменатору — предвзятый экзаменатор или незнающий ученик. V>Не зря пишу "или", потому что пусть ученик хоть гений мировой науки, а экзаменатор ни одной программы в жизни не написал, сдать или не сдать зависит лишь от субъективного настроя самого экзаменатора. От ученика оно не зависит, он может знать всё, или не знать ничего, и при этом сдать или не сдать с одинаковым шансом в зависимости от состояния экзаменатора. V> Найм на работуV>1. Без проверки знаний: V>- С++ знаешь? V>- Знаю. V>- Принят. V>2. Генератор случайного бреда: V>- А что, если в клюшка морковка асфальт, положить бумага зелёнка грифель? V>- Корова тыква багаж. V>- Мы вам позвоним. V>Собеседования первым способом проходят в мелких конторах, вторым в какой-нибудь знаменитой компании К. Но и то и другое лишь случайное стечение обстоятельств. V>А идея такая, взять стандарт, например, ANSI ISO/IEC 14882:2003(E) и посмотреть, как с этим справятся автоматизированные тесты, которые основаны на наборе, а не выборе. | |
От: | velkin | https://kisa.biz | |
Дата: | 29.10.14 20:42 | ||
Оценка: |
Скрытый текст | |
class-name – имя класса namespace-name – имя пространства имён qualified-name – (квалифицированное имя) уточнённое имя name – какое-то имя member – имя члена object – выражение дающее объект класса pointer – выражение дающее указатель pointer-to-member – указатель на член expr – некое выражение expr-list – список выражений lvalue – выражение обозначающее неконстантный объект type – произвольное имя типа | |
Скрытый текст | |
class-name::member namespace-name::member ::name ::qualified-name --- object.member pointer->member pointer[expr] expr(expr-list) type(expr-list) lvalue++ lvalue-- typeid(type) typeid(expr) dynamic_cast<type>(expr) static_cast<type>(expr) reinterpret_cast<type>(expr) const_cast<type>(expr) --- sizeof expr sizeof(type) ++lvalue --lvalue ~lvalue !expr -expr +expr &lvalue *expr new type new type(expr-list) new (expr-list) type new (expr-list) type(expr-list) delete pointer delete[] pointer (type)expr --- object.*pointer-to-member pointer->*pointer-to-member --- expr * expr expr / expr expr % expr --- expr + expr expr – expr --- expr << expr expr >> expr --- expr < expr expr <= expr expr > expr expr >= expr --- expr == expr expr != expr --- expr & expr expr ^ expr expr | expr expr && expr expr || expr expr ? expr : expr --- lvalue = expr lvalue *= expr lvalue /= expr lvalue %= expr lvalue += expr lvalue -= expr lvalue <<= expr lvalue >>= expr lvalue &= expr lvalue |= expr lvalue ^= expr --- throw expr --- expr, expr Напишите выражение операции разрешения области видимости класса. class-name::member Напишите название операции выражения class-name::member. разрешение области видимости класса Напишите выражение операции разрешения области видимости пространства имён. namespace-name::member Напишите название операции выражения namespace-name::member. разрешение области видимости пространства имён Напишите выражение операции глобальной области видимости. ::name Напишите название операции выражения ::name. глобальная область видимости Напишите выражение операции глобальной области видимости с уточнённым именем. ::qualified-name Напишите название операции выражения ::qualified-name. глобальная область видимости с уточнённым именем http://slovar-vocab.com/english-russian/vocab-tiger/qualified-name-4268836.html http://msdn.microsoft.com/en-us/library/zxcfe1bw.aspx --- Напишите выражение операции выбора члена посредством объекта. object.member Напишите название операции выражения object.member. выбор члена посредством объекта Напишите выражение операции выбора члена посредством указателя на объект. pointer->member Напишите название операции выражения pointer->member. выбор члена посредством указателя на объект Напишите выражение операции доступа по индексу. pointer[expr] Напишите название операции выражения pointer[expr]. доступ по индексу Напишите выражение операции вызова функции. expr(expr-list) Напишите название операции выражения expr(expr-list). вызов функции Напишите выражение операции конструирования значения. type(expr-list) Напишите название операции выражения type(expr-list). конструирование значения Напишите выражение операции постфиксного инкремента. lvalue++ Напишите название операции выражения lvalue++. постфиксный инкремент Напишите выражение операции постфиксного декремента. lvalue-- Напишите название операции выражения lvalue--. постфиксный декремент Напишите выражение операции идентификации типа. typeid(type) Напишите название операции выражения typeid(type). идентификация типа Напишите выражение операции идентификации типа во время выполнения. typeid(expr) Напишите название операции выражения typeid(expr). идентификация типа во время выполнения Напишите выражение операции преобразования с проверкой во время выполнения. dynamic_cast<type>(expr) Напишите название операции выражения dynamic_cast<type>(expr). преобразование с проверкой во время выполнения Напишите выражение операции преобразования с проверкой во время компиляции. static_cast<type>(expr) Напишите название операции выражения static_cast<type>(expr). преобразование с проверкой во время компиляции Напишите выражение операции преобразования без проверки. reinterpret_cast<type>(expr) Напишите название операции выражения reinterpret_cast<type>(expr). преобразование без проверки Напишите выражение операции константного преобразования. const_cast<type>(expr) Напишите название операции выражения const_cast<type>(expr). константное преобразование --- Напишите выражение операции получения размера объекта. sizeof expr Напишите название операции выражения sizeof expr. размер объекта Напишите выражение операции получения размера типа. sizeof(type) Напишите название операции выражения sizeof(type). размер типа Напишите выражение операции префиксного инкремента. ++lvalue Напишите название операции выражения ++lvalue. префиксный инкремент Напишите выражение операции префиксного декремента. --lvalue Напишите название операции выражения --lvalue. префиксный декремент Напишите выражение операции дополнения. ~lvalue Напишите название операции выражения ~lvalue. дополнение Напишите выражение операции отрицания !expr Напишите название операции выражения !expr. отрицание Напишите выражение операции унарного минуса. -expr Напишите название операции выражения -expr. унарный минус Напишите выражение операции унарного плюса. +expr Напишите название операции выражения +expr. унарный плюс Напишите выражение операции адреса. &lvalue Напишите название операции выражения &lvalue. адрес Напишите выражение операции разыменовывания. *expr Напишите название операции выражения *expr. разыменовывание Напишите выражение операции создания объекта с выделением памяти. new type Напишите название операции выражения new type. создание объекта с выделением памяти Напишите выражение операции создания объекта с выделением памяти и инициализацией. new type(expr-list) Напишите название операции выражения new type(expr-list). создание объекта с выделением памяти и инициализией Напишите выражение операции создания объекта с размещением в памяти. new (expr-list) type Напишите название операции выражения new (expr-list) type. создание объекта с размещением в памяти http://ru.wikipedia.org/wiki/New_%28C%2B%2B%29 За исключением формы, называемой «размещающей формой new», new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес свежевыделенной памяти. Напишите выражение операции создания объекта с размещением в памяти и инициализацией. new (expr-list) type(expr-list) Напишите название операции выражения new (expr-list) type(expr-list). создание объекта с размещением в памяти и инициализацией Напишите выражение операции уничтожения объекта с освобождением памяти. delete pointer Напишите название операции выражения delete pointer. уничтожение объекта с освобождением памяти Напишите выражение операции уничтожение объекта массива. delete[] pointer Напишите название операции выражения delete[] pointer. уничтожение объекта массива Напишите выражение операции преобразования типа в стиле Си. (type)expr Напишите название операции выражения (type)expr. преобразование типа в стиле си --- Напишите выражение операции выбора указателя на член посредством объекта. object.*pointer-to-member Напишите название операции выражения object.*pointer-to-member. выбор указателя на член посредством объекта Напишите выражение операции выбора указателя на член посредством указателя. pointer->*pointer-to-member Напишите название операции выражения pointer->*pointer-to-member. выбор указателя на член посредством указателя --- Напишите выражение операции умножения. expr * expr Напишите название операции выражения expr * expr. умножение Напишите выражение операции деления. expr / expr Напишите название операции выражения expr / expr. деление Напишите выражение операции получения остатка от деления. expr % expr Напишите название операции выражения expr % expr. остаток от деления --- Напишите выражение операции сложения. expr + expr Напишите название операции выражения expr + expr. сложение Напишите выражение операции вычитания. expr – expr Напишите название операции выражения expr – expr. вычитание --- Напишите выражение операции сдвига влево. expr << expr Напишите название операции выражения expr << expr. сдвиг влево Напишите выражение операции сдвига вправо. expr >> expr Напишите название операции выражения expr >> expr. сдвиг вправо --- Напишите выражение операции меньше. expr < expr Напишите название операции выражения expr < expr. меньше Напишите выражение операции меньше либо равно. expr <= expr Напишите название операции выражения expr <= expr. меньше либо равно Напишите выражение операции больше. expr > expr Напишите название операции выражения expr > expr. больше Напишите выражение операции больше либо равно. expr >= expr Напишите название операции выражения expr >= expr. больше либо равно --- Напишите выражение операции равно. expr == expr Напишите название операции выражения expr == expr. равно Напишите выражение операции не равно. expr != expr Напишите название операции выражения expr != expr. не равно --- Напишите выражение операции побитового И. expr & expr Напишите название операции выражения expr & expr. побитовое и Напишите выражение операции побитового исключающего ИЛИ. expr ^ expr Напишите название операции выражения expr ^ expr. побитовое исключающее или Напишите выражение операции побитового ИЛИ. expr | expr Напишите название операции выражения expr | expr. побитовое или Напишите выражение операции логического И. expr && expr Напишите название операции выражения expr && expr. логическое и Напишите выражение операции логического ИЛИ. expr || expr Напишите название операции выражения expr || expr. логическое или Напишите выражение операции условного выражения. expr ? expr : expr Напишите название операции выражения expr ? expr : expr. условное выражение --- Напишите выражение операции простого присваивания. lvalue = expr Напишите название операции выражения lvalue = expr. простое присваивание Напишите выражение операции умножения и присваивания. lvalue *= expr Напишите название операции выражения lvalue *= expr. умножение и присваивание Напишите выражение операции деления и присваивания. lvalue /= expr Напишите название операции выражения lvalue /= expr. деление и присваивание Напишите выражение операции получение остатка от деления и присваивания. lvalue %= expr Напишите название операции выражения lvalue %= expr. остаток от деления и присваивание Напишите выражение операции сложения и присваивания. lvalue += expr Напишите название операции выражения lvalue += expr. сложение и присваивание Напишите выражение операции вычитания и присваивания. lvalue -= expr Напишите название операции выражения lvalue -= expr. вычитание и присваивание Напишите выражение операции сдвига влево и присваивания. lvalue <<= expr Напишите название операции выражения lvalue <<= expr. сдвиг влево и присваивание Напишите выражение операции сдвига вправо и присваивания. lvalue >>= expr Напишите название операции выражения lvalue >>= expr. сдвиг вправо и присваивание Напишите выражение операции побитового И и присваивания. lvalue &= expr Напишите название операции выражения lvalue &= expr. побитовое и и присваивание Напишите выражение операции побитового ИЛИ и присваивания. lvalue |= expr Напишите название операции выражения lvalue |= expr. побитовое или и присваивание Напишите выражение операции побитового исключающего ИЛИ и присваивания. lvalue ^= expr Напишите название операции выражения lvalue ^= expr. побитовое исключающее или и присваивание --- Напишите выражение операции генерации исключения. throw expr Напишите название операции выражения throw expr. генерация исключения --- Напишите выражение операции последовательности. expr, expr Напишите название операции выражения expr, expr. последовательность | |
От: | velkin | https://kisa.biz | |
Дата: | 30.10.14 18:47 | ||
Оценка: |
Вопрос:
Знаете ли вы C++?
Варианты ответов:
знаю
не знаю
Правильный ответ:
знаю
От: | velkin | https://kisa.biz | |
Дата: | 01.11.14 17:53 | ||
Оценка: |
Скрытый текст | |
Автоматизированные тесты имеют расширение файла *.mtf. Для их запуска воспользуйтесь бесплатной версией программы MyTestX 10.2.0.3 http://mytest.klyaksa.net/htm/download/ Тесты на роли [количество вопросов]: arc.mtf — архитектор по [0] bus.mtf — бизнес-аналитик [0] cpp.mtf — разработчик c++ [199] pro.mtf — менеджер проекта [0] rel.mtf — релиз менеджер [0] stl.mtf — пользователь stl [0] sys.mtf — системный аналитик [0] tes.mtf — тестировщик по [0] | |