Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет smi13 ([info]smi13)
@ 2009-06-01 22:24:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:c++, programming

Вопросы по С++ и не только.

Не все вопросы касаются именно языка C++. Как например, 11. Это, скорее, способ мышления.

  1. Что такое explicit?

  2. Ключевое слово explicit используется при объявлении конструктора класса, во избежании нежелательного неявного преобразования типов. Реализуя параметризованный (скажем, int) конструктор для некоторого класса (скажем, A), мы тем самым даем возможность этому преобразованию A a = 5;. Ясно, что выполнится как раз параметризованный конструктор, при условии отсутствия explicit и реализации оператора присваивания.

  3. Что такое mutable?

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

  5. Могут ли static-функции быть const?

  6. Однозначно нет. В static функции не передается указатель this. В const - передается, да еще и константный.

  7. Что такое const_cast, dynamic_cast, static_cast?

  8. Преобразование типов в C++. Есть мнение, что использование этих ключевых слов очень редко бывает обоснованным.

    • const_cast

    • Снятие квалификаторов const, volatile с переменной. Ошибка приведения - ошибка компиляции.

    • dynamic_cast

    • Приведение указателей либо ссылок на полиморфные классы друг к другу. Полиморфизм означает в данном случае наличие хоть одной виртуальной функции и он критичен для dynamic_cast: ошибка компиляции в противном случае. Ошибка выполнения сигнализируется возвращенным NULL в случае указателей и сообщением bad_cast в случае ссылок.

    • static_cast

    • Приведение одного типа к другому. Используются встроенные правила в случае встроенных типов, свои правила в случае своих. Если речь идет об указателях, то либо один из них обязан быть void *, либо оба должны указывать на объекты классов из одной иерархии. Ошибка приведения - ошибка компиляции и undefined behavior в случае ошибки приведения указателей на объекты классов из одной иерархии.

  9. Что такое инстанцирование шаблонов?

  10. Вообще инстанцирование есть создание экземпляра класса. Инстанцирование шаблонов судя по всему есть полиморфное инстанцирование. Пример: vector<int> a; Остается неясным обязательна ли при инстанцировании аллокация.

  11. Что такое частичная специализация шаблонов?

  12. Синтаксически это определение еще одного шаблона, отличающегося от общего лишь подстановкой фактических типов или значений. Специализированный шаблон может иметь собственные методы и члены, он не связан с общим. Может использоваться, например, для оптимизации реализации некоторого случая для особого типа. Частичная специализация шаблона неявно конкретизируется при использовании в программе, а именно: если для шаблона класса объявлены частичные специализации, компилятор выбирает то определение, которое является наиболее специализированным для заданных аргументов.

  13. Применима ли частичная специализация к функциям?

  14. В C++ нет такой возможности. Ее отсутствие часто аргументируют примером, в котором показана ошибочность интуиции разработчика.

  15. Что такое виртуальный деструктор и зачем он нужен?

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

  17. Что такое чисто виртуальный деструктор?

  18. Используется для придания абстрактности классу, запрета инстанцирования объекта данного класса. Миф о том, что не может иметь тела - миф, тело может быть, хоть это и не соответствует нынешнему стандарту. Отличается от чисто виртуальных функций тем, что производные классы не обязаны иметь определения деструктора.

  19. Что происходит, если исключение выбрасывается в конструкторе?

  20. Объект не создается, деструктор в дальнейшем не вызывается, отсюда возможная проблема - утечки памяти.

  21. Что такое агрегация и композиция?

    • Композиция - методика создания сложных объектов или типов данных из более простых. Часто говорят, что объекты входящие в композицию сложного объекта находятся в отношении "has-a", это означает, что простые объекты принадлежат, подчиняются сложному. Сложный объект выполняет функцию сложнее, чем просто "сумма" функций простых. Пример: автомобиль (сложный объект) и колеса, руль (простые).

    • Агрегация отличается от композиции тем, что отношение подчинения простых объектов сложному устраняется. Пример: университет и его факультеты (композиция), университет и его профессора (агрегация). Если перестает существовать университет перестают и факультеты, но не профессора.

  22. Класс стратегия, класс свойств?


  23. Что такое полиморфизм? Средства C++ реализующие полиморфизм.

  24. Полиморфизм - взаимозаменяемость объектов с одинаковым интерфейсом. "Один интерфейс, много методов". Перегрузка операторов и функций, шаблоны, параметры по умолчанию - это примеры полиморфизма, относящегося ко времени компиляции. Полиморфизм периода выполнения реализуется использованием виртуальных функций. Надо заметить, что полиморфизм времени выполнения неразрывно связан с использование производных классов так как без них использование виртуальности не имеет смысла.

  25. Что такое срезка (slicing)

  26. Часто случается, что класс-родитель содержит меньше информации, чем класс-потомок. Присваивание объекту класса-родителя объект класса-потомка, либо передачу в функцию, принимающую объект класса-родителя, объекта класса-потомка и называют срезкой.

  27. Как реализуется возможность перегрузки функций в С++?

  28. Процесс разрешения перегрузки разделяют на три этапа:

    • Выделяется множество перегруженных функций для данного вызова, а также свойства списка аргументов, переданных функции.

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

    • Находится функция, которая лучше всего соответствует вызову. Говорят, что здесь имеет место задача линейного программирования.

  29. Когда может понадобиться конструктор объявленный с private?

  30. Имеется информация как минимум о двух случаях обоснованности определения конструкторов в private:

    • Копирующий конструктор. Во избежании багов возникающих из-за забытого символа ”&” в описании функции.

    • Имеется необходимость создавать экземпляры класса только внутри иерархии.

  31. Что такое RTTI?

  32. Run-Time Type Identification. Динамическая идентификация типов. В языке С++ возникают ситуации, в которых тип объекта неизвестен во время компиляции, так как его природа сможет быть выяснена только в период выполнения. Полиморфизм влечет за собой такие ситуации. Инструментами RTTI в C++ являются операторы dynamic_cast и typeid. Последний используется для получения типа объекта во время выполнения программы.

  33. Что такое static assert?

  34. Аналог динамического assert для времени компиляции.
    Примеры реализации:

    • #define CASSERT(COND) \
      typedef char __AP_COMM_CASSERT [(COND) ? 1 : -1]

    • #define CASSERT(COND) \
      switch(0){case 0:case (COND):;}

  35. Что такое LSP?

  36. Liskov substitution principle. Принцип подстановки Барбары Лисков. Формулируется следующим образом: "Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T." Проще говоря, классы наследники обязаны обеспечивать ожидаемое обуславливаемое предком внешнее поведение.

  37. Что такое Open/Closed Principle?

  38. Формулировка: "Программы и сущности (классы, модули, функции) должны быть открыты для расширения и закрыты для изменения"

  39. В чем отличие между typename и class?

  40. По стандарту семантических и синтаксических различий нет. Тут надо заметить, во избежании путаницы, что речь идет об отличиях указанных ключевых слов в контексте разговора о параметрах шаблонов. Ясно, что например при определении класса нужно писать class, а не typename.