Ответы на некоторые вопросы по С++
Автор: PP
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).
Возврат из функции по значению.
28 июля 2006 (Обновление: 13 янв 2009)