Изменения

Перейти к: навигация, поиск

Старые вопросы на экзамен по C++

5093 байта добавлено, 05:05, 16 июня 2011
запилил тут ответов немного
# Что определяет класс? Чем обличается класс от объекта?
#: Класс определяет тип объекта, а объект - это конкретный экземпляр класса.
# Можно ли объявлять массив объектов? А массив классов?
#: Смотря что считать массивом - в обычном смысле можно объявить массив объектов, с помощью метапрограммирования можно делать списки типов(классов)
# Разрешается ли объявлять указатель на объект? А указатель на класс?
#: Да. Нет.
# Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
#: Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.
# Как называется использование объекта одного класса в качестве поля другого класса?
#: ??
# Является ли структура классом? Чем класс отличается от структуры?
#: Является, у структуры все поля/методы по умолчанию public, у класса - private.
# Объясните принцип инкапсуляции.
#: Инкапсуляция - сокрытие методов и полей класса от пользователя, в целях сохранения внутренних инвариантов. При этом то, что помечено как public, называется интерфейсом класса.
# Что такое композиция?
#: ??
# Для чего используются ключевые слова public и private?
#: см. инкапсуляция, также при public - наследовании все члены базового класса наследуются с теми же модификаторами, при private - все члены базового класса становятся private.
# Можно ли использовать ключевые слова public и private в структуре?
#: да
# Существуют ли ограничения на использование public и private в классе? А в структуре?
#: нет
# Обязательно ли делать поля класса приватными?
#: нет
# Что такое метод? Как вызывается метод?
#: Это функция, являющаяся членом класса. Если она не статическая, при ее вызове в нее неявно передается указатель на экземпляр, от которого она вызывается.
# Может ли метод быть приватный?
#: да
# Как определить метод непосредственно внутри класса? А вне класса? Чем эти определения отличаются?
#: Просто берем и определяем :) Вне класса - в описании класса пишем только объявление метода, вне класса реализацию.
# Можно в методах присваивать параметрам значения по умолчанию?
#: да
# Что обозначается ключевым словом this?
#: указатель на экземпляр класса, для которого вызван текущий метод. В статическом методе this недоступен.
# Зачем нужны константные методы? Чем отличается определение константного метода от обычного?
#: константный метод гарантирует, что мы не изменим состояние класса в процессе его работы. После сигнатуры надо написать const.
# Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант?
#: Да. Нет.
# Объясните принцип полиморфизма.
#: Полиморфизм - возможность работать с разными типами одинаковым образом. Статический - перегрузка функций, шаблоны. Динамический - виртуальные функции.
# Сколько места в памяти занимает объект класса? Как это узнать?
#: sizeof(a)
# Каков размер «пустого» объекта?
#: Здесь вроде понятно, что он должен быть ненулевой(у меня 1 байт, например), вопрос только почему?
# Влияют ли методы на размер объекта?
#: Если есть виртуальные методы, то размер увеличивается засчет указателся на таблицу виртуальных функций.
# Одинаков ли размер класса и аналогичной структуры?
#: да
# Какие операции нельзя перегружать? Как вы думаете, почему?
#: a ? b : c - в Страуструпе говорится что нет особых причин запрещать его перегрузку, так что непонятно.
#: a::b - это вообще говоря не какая-то функция, а просто удобный способ избежать конфликта имен.
#: a.b - непонятно, как тогда вызывать методы, и могут возникать конфликты ([http://pastebin.com/fJm050jm])
#: sizeof(a), typeid(a) - видимо, что-то низкоуровневое, тоже надо поподробнее узнать
#: a.*b - вообще без понятия что он делает
# Можно ли перегружать операции для встроенных типов данных?
#: Нет
# Можно ли при перегрузке изменить приоритет операции?
#: Нет
# Можно ли определить новую операцию?
#: Нет
# Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса?
#: Первый параметр оператора как метода класса - всегда неявно *this. Внешним образом нельзя обратиться к private полям класса. По этой причине, видимо, оператор>>/<< делается friend'ом - так как там он фактически перегружается внешним образом.
# Какой результат должны возвращать операции с присваиванием?
#: Ссылку на *this
# Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента?
#: Префиксная(++a): T & operator++(); Постфиксная(a++): T operator++(int); - с фейковым параметром чтобы как-то отличать
# Что означает выражение *this? В каких случаях оно используется?
#: Разыменование указателя на текущий экземпляр. Например, чтобы вернуть объект :)
# Какие операции не рекомендуется перегружать как методы класса? Почему?
#: Нужно перегружать только те, которые меняют private члены(типа +=, -= и т.д.). А вот уже +, - и т.д. - могут воспользоваться уже перегруженными +=, -=. Не рекомендуется перегружать ||, &&, так как по умолчанию они оптимальны - т.е. если установлена истинность одного аргумента, второй даже не обрабатывается.
# Какие операции разрешается перегружать только как методы класса?
#: =, [], (), ->. Вопрос - почему?
# Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?
# Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода.

Навигация