автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 11:58
Оценка:
Везде одна и та же проблема, начиная от образования и кончая наймом кандидатов.

Образование


1. Преподаватель может обучать плохо — неумелый преподаватель.
2. Ученик может плохо учиться — ленивый ученик.
3. Ученик не смог сдать предмет экзаменатору — предвзятый экзаменатор или незнающий ученик.

Не зря пишу "или", потому что пусть ученик хоть гений мировой науки, а экзаменатор ни одной программы в жизни не написал, сдать или не сдать зависит лишь от субъективного настроя самого экзаменатора. От ученика оно не зависит, он может знать всё, или не знать ничего, и при этом сдать или не сдать с одинаковым шансом в зависимости от состояния экзаменатора.

Найм на работу


1. Без проверки знаний:
— С++ знаешь?
— Знаю.
— Принят.
2. Генератор случайного бреда:
— А что, если в клюшка морковка асфальт, положить бумага зелёнка грифель?
— Корова тыква багаж.
— Мы вам позвоним.

Собеседования первым способом проходят в мелких конторах, вторым в какой-нибудь знаменитой компании К. Но и то и другое лишь случайное стечение обстоятельств.

А идея такая, взять стандарт, например, ANSI ISO/IEC 14882:2003(E) и посмотреть, как с этим справятся автоматизированные тесты, которые основаны на наборе, а не выборе.
Re: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 14:42
Оценка:
Здравствуйте, velkin, Вы писали:

V>А идея такая, взять стандарт, например, ANSI ISO/IEC 14882:2003(E) и посмотреть, как с этим справятся автоматизированные тесты, которые основаны на наборе, а не выборе.


Вероятно для тестов лучше всего использовать репозиторий.
  Скрытый текст
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

63 ключевых слова.

Тест вероятно может быть:
составление слов
определение => понятие
понятие => определение

Любой выбор не желателен, так как является подсказкой.
Re: автоматизированные тесты
От: LaptevVV Россия  
Дата: 29.10.14 14:50
Оценка: +1
Здравствуйте, velkin, Вы писали:

V>А идея такая, взять стандарт, например, ANSI ISO/IEC 14882:2003(E) и посмотреть, как с этим справятся автоматизированные тесты, которые основаны на наборе, а не выборе.

Не понял.
1. "как с этим справятся" — с чем справятся. "Это" — это что? Если стандарт, то зачем с ним справляться?
2. "автоматизированные тесты" — откуда они возмутся? Что за автоматизированные тесты? Почему они должны справляться со стандартом?
3. "основаны на наборе, а не выборе" — набор чего? Кто это набирает?
Сударь — активно работающий программист ?
Только активно работающий программист таким образом формулирует вопросы.
Знаю — сам такой был...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 15:47
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>1. "как с этим справятся" — с чем справятся. "Это" — это что? Если стандарт, то зачем с ним справляться?


Тесы буду делать по документу "C++ Standard — ANSI ISO IEC 14882 2003.pdf", перевод если надо из книги Страуструпа "Язык программирования C++, Специальное издание".

LVV>2. "автоматизированные тесты" — откуда они возмутся? Что за автоматизированные тесты? Почему они должны справляться со стандартом?


Возьмутся они от меня. Зарегался только что на гитхабе, и создал проект.

Тесты имеют расширение файла *.mtf.
Для их запуска воспользуйтесь бесплатной версией программы MyTestX 10.2.0.3
http://mytest.klyaksa.net/htm/download/


LVV>3. "основаны на наборе, а не выборе" — набор чего? Кто это набирает?


Ну это типа:

выбор члена
Напишите выражение использования оператора выбора указателя на член посредством указателя.
pointer->*pointer-to-member

умножение
#Напишите выражение использования оператора умножения.
expr * expr


Вот так надо ручками на клавиатуре и набрать "expr * expr", никаких готовых вариантов, только строка для ввода. Ошибся в одном символе, не зачёт.

У меня только хардкор. А так я просто хочу проверить идею оценки программистов посредством автоматизированных тестов без участия субъективного человеческого фактора.

В MyTestX тесты можно потом собрать в один гигантский тест. Прошёл мегатест, знаешь C++, не прошёл, не знаешь C++. Не факт, конечно, что я смогу набрать много тестов. Не препод всё таки, мне за это не платят.

А вот ещё что, самое главное. Эта тема для заинтересованных лиц, если они будут, для того чтобы ругать тесты, так как я могу допустить ошибки.
Re[3]: автоматизированные тесты
От: LaptevVV Россия  
Дата: 29.10.14 16:56
Оценка: +1
Здравствуйте, velkin, Вы писали:

V>Вот так надо ручками на клавиатуре и набрать "expr * expr", никаких готовых вариантов, только строка для ввода. Ошибся в одном символе, не зачёт.


V>У меня только хардкор. А так я просто хочу проверить идею оценки программистов посредством автоматизированных тестов без участия субъективного человеческого фактора.


V>В MyTestX тесты можно потом собрать в один гигантский тест. Прошёл мегатест, знаешь C++, не прошёл, не знаешь C++. Не факт, конечно, что я смогу набрать много тестов. Не препод всё таки, мне за это не платят.


V>А вот ещё что, самое главное. Эта тема для заинтересованных лиц, если они будут, для того чтобы ругать тесты, так как я могу допустить ошибки.

1. Как предполагается оценивать результат выполнения теста?
Например: a*b будет считаться эквивалентом b*a или нет?
2. Насколько сложными предполагается сделать тесты?
3. Тесты только на знание стандарта или что-то еще?
Извини за вопросы, но я просто в теме, и пока не вижу четких границ предполагаемой работы.
Например, ты знаешь о модели Раша, применяемой для оценивания результатов тестирования?
Или предполагаешь оценивать как-то по своему?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 17:37
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>1. Как предполагается оценивать результат выполнения теста?


Оценка не столь важна, в программе можно задать, чтобы на проценты от выполненных тестов, их сложности и т.д. и т.п. что-то выводилось. Я всё буду делать линейно, мне важно только количество правильных ответов, а это и так будет видно. А вообще при неправильном ответе у меня настройка на вывод правильного, так что тесты самообучающие.

LVV>Например: a*b будет считаться эквивалентом b*a или нет?


Программа позволяет такое сделать, но что-то сомневаюсь, что мне такая возможность понадобится.

LVV>2. Насколько сложными предполагается сделать тесты?


Исходя из определения они уже достаточно сложные. Выбрать из ответов не получится, человек или знает, или нет. Двойных формулировок нет. По сравнению с устным экзаменом используется зрительный, а не вербальный канал, то есть вопрос можно посмотреть второй раз. Только вот уровень сложности будет не меньший.

LVV>3. Тесты только на знание стандарта или что-то еще?


Пока на знания стандарта без STL. Хотя в принципе можно делать тесты на что угодно. Просто есть примеры в интернете, но это же каша какая-то. Ничему она не обучит, а из-за малого количества вопросов не подтвердит знания. Формулировки туманные, а надо чтобы тест был атомарен и чему-либо учил.
  Скрытый текст
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 типов производит инициализацию нулями.
Для стсатических переменных встроенных типов производиться инициализация нулямию

LVV>Извини за вопросы, но я просто в теме, и пока не вижу четких границ предполагаемой работы.

Я тоже не вижу, но даже, если создать хоть сколько-нибудь тестов, то уже получим что-то. Что-то лучше, чем ничего, это можно расширить.

LVV>Например, ты знаешь о модели Раша, применяемой для оценивания результатов тестирования?

LVV>Или предполагаешь оценивать как-то по своему?

Вообще не собираюсь как-то по особому оценивать. В идеале нужно набрать 100%, вот и всё. А если не набрал, ну покажет, набрал 67%, или 12% и так далее, а выводы пусть каждый делает индивидуально.
Re[5]: автоматизированные тесты
От: LaptevVV Россия  
Дата: 29.10.14 18:55
Оценка:
Здравствуйте, velkin, Вы писали:

LVV>>3. Тесты только на знание стандарта или что-то еще?


V>Пока на знания стандарта без STL. Хотя в принципе можно делать тесты на что угодно. Просто есть примеры в интернете, но это же каша какая-то. Ничему она не обучит, а из-за малого количества вопросов не подтвердит знания. Формулировки туманные, а надо чтобы тест был атомарен и чему-либо учил.

V>
  Скрытый текст
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>Для стсатических переменных встроенных типов производиться инициализация нулямию

Вопросы из моей книжки?

V>Вообще не собираюсь как-то по особому оценивать. В идеале нужно набрать 100%, вот и всё. А если не набрал, ну покажет, набрал 67%, или 12% и так далее, а выводы пусть каждый делает индивидуально.

Ну, тут не совсем все так просто.
Ведь при удачной системе ее начнут использовать собеседователи.
И они, естественно, будут смотреть на результаты.

Второе: не все готовы проходить тест в сотни вопросов.
Поэтому тут лучше придумать некий адаптивный механизм выбора очередного вопроса по сложности.
Отвечает подряд правильно — переходим к более сложной теме, пропуская остальные вопросы по данной теме.

Принцип окончания теста тоже важен.
До первой ошибки.
Или до определенного процента ошибок...
В общем — много нюансов.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 19:17
Оценка: :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Ну, тут не совсем все так просто.

LVV>Ведь при удачной системе ее начнут использовать собеседователи.
LVV>И они, естественно, будут смотреть на результаты.

Пусть используют, не факт, что мне завтра не надоест это писать, сегодня же доделаю выражения. Вот тогда любой другой человек и сможет заценить всю степень задротства этих тестов.

LVV>Второе: не все готовы проходить тест в сотни вопросов.


Тогда им очень повезло, так как вопросов тысячи и тысячи, причём без STL. С STL страшно даже представить сколько, потому если он и будет, что пока сомнительно, то отдельно. Я не представляю, как можно оценить знание C++ задав пару случайных вопросов. Кстати, ответить на несколько тысяч вопросов не так утомительно как кажется на первый взгляд тому, кто этого не делал. Вот выучить тысячи вопросов сложнее, требуется в несколько раз больше времени. Но гораздо дольше создавать эти тесты. И если выучить их можно с нулевыми знаниями хоть школьнику, то создавать надо со знаниями эксперта предметной области.

LVV>Поэтому тут лучше придумать некий адаптивный механизм выбора очередного вопроса по сложности.

LVV>Отвечает подряд правильно — переходим к более сложной теме, пропуская остальные вопросы по данной теме.

А смысла нет, тут или знаешь C++ или не знаешь. Впрочем у меня же всё сейчас в открытый доступ идёт, настроить можно как угодно, тесты без пароля. И всё равно пока их не накопишь, не поймёшь как лучше.
Re: автоматизированные тесты
От: vpchelko  
Дата: 29.10.14 19:56
Оценка:
Здравствуйте, velkin, Вы писали:
  Скрытый текст
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) и посмотреть, как с этим справятся автоматизированные тесты, которые основаны на наборе, а не выборе.


Шизофазия?
Сало Украине, Героям Сала
Re: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 29.10.14 20:42
Оценка:
В репозиторий добавлены автоматизированные тесты выражений cpp.lex.operators.expr, не проверялись на правильность.
  Скрытый текст
class-name – имя класса
namespace-name – имя пространства имён
qualified-name – (квалифицированное имя) уточнённое имя
name – какое-то имя
member – имя члена
object – выражение дающее объект класса
pointer – выражение дающее указатель
pointer-to-member – указатель на член
expr – некое выражение
expr-list – список выражений
lvalue – выражение обозначающее неконстантный объект
type – произвольное имя типа

68 понятий, 136 вопросов
  Скрытый текст
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.
последовательность
Re: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 30.10.14 18:47
Оценка: :))
V>1. Без проверки знаний:
V>- С++ знаешь?
V>- Знаю.
V>- Принят.

Пока делал тесты понял, что можно создать автоматизированный тест всего лишь с одним вопросом.

Вопрос:
Знаете ли вы C++?

Варианты ответов:
знаю
не знаю

Правильный ответ:
знаю


Re[2]: автоматизированные тесты
От: velkin Удмуртия https://kisa.biz
Дата: 01.11.14 17:53
Оценка:
Здравствуйте, velkin, Вы писали:

Тесты хорошо делятся на разделы. Разделы в свою очередь состоят в главах источников.

В "C++ Standard — ANSI ISO IEC 14882 2003" прописали, что его источником является книга Страуструпа "Язык программирования C++".
Преобразованные источники вопросов так же добавлены в репозиторий в виде текстового слоя.

По идее даже, если не создавать вопросы на другие роли, ввести бы их надо, для того, чтобы не путать разработчика С++ с другими ролями присущими человеку занятому программированием.
  Скрытый текст
Автоматизированные тесты имеют расширение файла *.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]


Ввод текста на самом деле не такой хардкорный, как кажется. Для пробы разбавил тестами на составления букв. Похоже вопросов с выбором не удастся избежать везде, но можно снизить их число.


Пока что сделана лишь наметка разделов, чтобы не утонуть в море неструктурированных вопросов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.