Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_OOP.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
302.59 Кб
Скачать

39. Друзья класса. Дружественные функции и классы. Правила относительно друзей. Пример.

Дружественная функция – функция, которая не является членом класса, но имеет доступ к его закрытым членам. Для того, чтобы указать что функция является другом класса, надо добавить в класс сигнатуру этой функции с модификатором friend: class myclass {int n; public: friend int factor();}; int factor() {myclass obj; obj.n = 100;}. Из примера видно, что функция может получить доступ к внутренним члена класса только через конкретный объект класса.

Правила: дружественная функция не член класса, т.е. она не может вызываться через имя объекта; дружественная функция не наследуется; функция может быть дружественной по отношению к нескольким классам; функция может быть членом одного класса и дружественной к другому классу: class A {public: int myfunc();}; class B {public: friend int A::myfunc();};

Преимущества: используется для перегрузки левосторонних операторов (кроме оператора присваивания) и операторов ввода-вывода; помогает получить доступ к закрытым членам нескольких классов.

40. Оператор присваивания. Назначение. Синтаксис. Пример.

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

Если несколько указателей указывают на 1 объект, то высвобождения памяти стоит вообще избегать.

43. Статические (static) члены класса. Назначение. Синтаксис. Пример.

Можно объявить элемент класса (данные или функцию) как статический. Статический элемент данных является по существу глобальной переменной с областью действия в классе и разделяется всеми представителями класса. Он только один, вне зависимости от того, сколько объектов имеет класс. На самом деле статический элемент данных существует даже в том случае, когда никаких представителей класса не создано. Помимо объявления в определении класса, статический элемент данных должен еще и определяться вне класса или в инициализаторе конструктора: class SomeClass {static int iCount;}; int SomeClass::iCount = 0;

Обращаться к открытым статическим элементам класса можно либо через любой его представитель операциями “.” и “->”, либо с помощью операции разрешения области действия (SomeClass::iCount). Последний способ предпочтительнее, так как показывает, что элемент не связан с конкретным объектом.

Статические элементы-функции. Функция класса, объявленная с модификатором static, не связывается ни с какими его конкретными представителями. Другими словами, ей не передается указатель this в качестве скрытого параметра. Это означает, что: статическая функция-элемент может вызываться, даже если никаких объектов не создано; статическая функция-элемент может обращаться только к статическим элементам данных класса и вызывать только другие статические функции-элементы класса; такая функция не может быть объявлена виртуальной.

  1. Объекты без соостояние (stateless), с неизменным состоянием (immutable), моностостоянием (monostate) см вопрос 5

45. Неизменяемые (immutable) члены-функции класса. Назначение. Проблемы и решения. Пример на С++.

В некоторых случаях требуется использовать классификатор const для функций-членов класса, чтобы показать, что она не должна изменять состояния класса (например: int get_value() const {};). Но иногда все-таки приходится снимать идентификатор const для заполнения некоторых членов путем приведения типов const_cast<>(). Для того чтобы явно указать какие члены может изменять функция с идентификатором const необходимо пометить эти поля идентификатором mutable: class Date { mutable bool cache; void get_cache() const {… cache = true; …}};

Framework.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]