Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AllCandC++Lectures.docx
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
52.56 Кб
Скачать

Друзья класса

В некоторых случаях удобно, чтобы функции не принадлежащие к данному классу имели доступ ко всем членам этого класса, включая private. Чтобы обеспечить это прототип или полное определение такой функции должен включить определение класса вместе со спецификатором friend. Класс объявляет своих друзей, но функция не может себя объявить другом. В классе может быть объявлено сколько угодно дружественных функций, в том числе, если объявить дружественным класс, то все его методы становятся друзьями. Дружественные функции могут быть описаны в любом разделе, и в prviate и в public. Они не подчиняются правилам ограничениям доступа. Основной отличие дружественной функции от функции члена состоит в том, что друзья не получают указатели this. А это значит, что для работы с объектом его нужно передать в дружественную функцию через аргумент.

Область видимости в классе

Когда пишут программу на СИ, то программисту нужно учитывать видимость переменных и методов. Если необходимо вызвать функцию, то она должна быть либо уже определена, либо объявлена с помощью прототипа. В СИ++ при описании класса, на расположение определений и объявлений влияет: в какой раздел, private или public нам необходимо их поместить. Эти требования могут войти в противоречия с требованиями областей видимости. Например: метод из раздела public может обращаться к переменной, которая будет описана позже в разделе private. Чтобы решить эту проблему в СИ++ добавлена новая область видимости в "классе". Все классы обладают такой видимостью, а реально это означает, что порядок объявлений и определений в классе может быть произвольным, потому что все видно отовсюду. Видимость в классе позволяет решить еще 1ну проблему. Каждый метод может использовать много аргументов. В СИ, чтобы уменьшить кол-во передаваемых параметров часть из них делают глобальными, то есть доступными напрямую во всех функциях ниже. Это упрощает вызовы функций, но создает возможность для случайных ошибок. Методы класса в СИ++ могут использовать данные из многих полей класса. Область видимости в классе позволяет сделать все поля "глобальными" для всех методов. То есть передавать эти поля через аргументы не нужно.

Уточнение концепции ограничения доступа

В СИ++ не делается попытка обеспечить максимальные возможности для управления ограничением доступа. То есть использовать все мыслимые ограничения доступа. Вместо этого применяется ограниченный набор правил.

1) ограничения отслеживаются на стадии компиляции.

2) ограничения направлены на защиту программиста от собственных ошибок.

3) механизм ограничения не зависит от того к чему он применяется. То есть на все поля и методы он действует одинаково.

Правила ограничения доступа распространяются, в том числе и на конструктор.

4) единицей защиты является класс а не отдельный объект.

Наследование

Два типа иерархии объектов:

1) На схеме компьютера изображена иерархия, потому что каждый верхний уровень описывает более общие понятия чем нижний. Отношения, связывающие объекты, можно назвать "содержит". Например: компьютер содержит системный блок, системный блок содержит процессор. Так как речь идет об иерархии частей, то такую схему называют partnomy. Эта иерархия может реализовываться при описании классов. В этом случае свойства класса имеют тип некоторого другого класса.

Class engine {...};

Class auto {

Engine eng;...};

2) эта иерархия является (AKO (a kinf of)). Персональный компьютер является компьютером. Планшет является персональным и компьютером вообще. Иначе: персональный компьютер - разновидность компьютера. Планшет - разновидность персонального компьютера. И планшеты разновидность компьютера вообще. Такая иерархия называется таксономия. Каждый следующий уровень иерархии уточняет свойства предыдущего уровня. Персональный компьютер - это компьютер, предназначенный для индивидуального использования. Планшетный - это персональный компьютер, который легко переносить. Если мы опишем свойства персонального компьютера, то они будут распространяться и на настольные и на планшетные. Поэтому, описывая планшетный, компьютер мы можем не повторять описание персонального, а просто сказать - это персональный + такие-то свойства. Иначе говоря, планшетные компьютеры наследуют свойства персональных, и компьютеров вообще. В этой иерархии каждый уровень определяет тип объектов, но эти объекты одновременно принадлежат всем типам своих предков.

Этот тип иерархии используется для реализации наследования в СИ++.

Единичное наследование в C++

Различают два типа наследования: единичное и множественное. При единичном наследовании каждый класс имеет только один непосредственный родительский класс. При множественном наследовании родительских классов может быть несколько. Родительский класс называют базовым, а дочерние производными. С точки зрения программирования реализация наследования означает, что родительский класс передает дочернему свои свойства и методы, которые не нужно заново определять дочерними классами. Дочерний класс пользуется ими как своими собственными. Объекты дочернего класса пользуются ими как принадлежащими этому классу. В СИ++ есть механизмы, позволяющие управлять наследованием:

1) новый тип разделов в описании классов

Так как наследование предполагает близость классов, то в СИ++ добавлен третий раздел protected, который содержит члены класса, доступные методам дочерних классов. При прямом обращении к этим членам protected работает также как private.

2) типы наследования: в СИ++ наследование может быть реализовано как public, protected и private. Этот механизм позволяет управлять тем, какой уровень доступности будут иметь член родительского класса, когда они рассматриваются как члены дочернего класса. По умолчанию используется наиболее ограничительный тип наследования private.

Для того чтобы указать, что некоторый класс является наследником другого класса используется следующий синтаксис: class Derived: тип_наследования Base {...}

Class Base {

Public: int x; int y;

};

Class derived: base {...}

Поля x и y как члены класса derived будут относиться к разделу private.

В СИ++ тип наследования влияет на доступность всех членов класса. Иногда нам нужно для некоторых полей сохранить уровень доступа. Например, нужно оставить поле y в разделе public. В производном классе можно восстановить уровень доступности отдельных членов базового класса. Для этого нужно добавить указание на этот член класса в соответствующий раздел производного класса, в который его нужно восстановить. Y был в разделе public. После наследования он попал в раздел private. Мы можем восстановить уровень, добавив в раздел public производного класса указание на поле y: public: base::y;

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