
- •5. Объекты и их жизненный цикл. Создание и уничтожение объектов. Алгоритм реализации в .Net освобождения памяти.
- •6. Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
- •8. Инкапсуляция. Скрытие членов класса.
- •15. Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
- •16. Виртуальные методы. Функциональное назначение. Примеры применения.
- •17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
- •18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.
- •Вопрос 19.
- •Вопрос 20
- •Вопрос 21
8. Инкапсуляция. Скрытие членов класса.
Управление доступом к членам осуществляется следующими ключевыми словами:
public - открытый доступ, члены класса доступны из любой точки программы;
protected - защищенный доступ, члены класса доступны внутри класса и его потомках;
private - закрытый (частный) доступ, члены класса доступны только внутри класса.
Если класс определяется через ключевое слово struct, то по умолчанию члены имеют атрибут public. Если через слово class, то атрибут private.
Объекты одного типа имеют доступ к закрытым/защищенным членам друг друга. Это удобно для создания конструкторов копирования и операций присвоения.
Эти же ключевые слова используются при наследовании классов, чтобы указать новые атрибуты наследуемых членов, имеющих открытый или защищенный доступ.
При наследовании класса как public (по умолчанию), открытые члены остаются открытыми, защищенные остаются защищенными.
При наследовании класса как protected, открытые и защищенные становятся защищенными.
При наследовании класса как private открытые и защищенные члены становятся закрытми.
#include <iostream>
using namespace std;
class MyClassParent {
int p1,p2;
public: // все последующие члены открытые
int a,b;
MyClassParent(){p1=10; p2=20; a=50; b=60;}
int psum() {return p1+p2;}
} pcls;
class MyClass: protected MyClassParent {
public:
int absum(){return a+b;}
} cls;
int main() {
// ошибка, член p1 недоступен из вне
// pcls.p1=23;
// обращение к открытым членам
// нет ошибки
pcls.a=20;
cout<<"pcls.psum()="<<pcls.psum()<<endl;
// ошибка, член а уже не открытый
// cls.a=20;
// обращение к открытому члену
// нет ошибки
cout<<"cls.absum()="<<cls.absum()<<endl;
return 0;
}
9способы построения новых классов из сушествуюших ранее Наследование функциональное назначение реализация примеры применения
Классы в С++ - это абстракция описывающая методы, свойства, ещё не существующих объектов. Объекты - конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса. В ООП существует три основных принципа построения классов:
Инкапсуляция - это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.
Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.
Полиморфизм - свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Операционная система компьютера представляет собой комплекс взаимосвязанных программ, который обеспечивает управление аппаратурой компьютера и прикладными программами, а также действует как интерфейс между аппаратурой, прикладными программами и пользователем.
Основные функции ОС:
Выполнение по запросу программ тех достаточно элементарных (низкоуровневых) действий, которые являются общими для большинства программ и часто встречаются почти во всех программах (ввод и вывод данных, запуск и остановка других программ, выделение и освобождение дополнительной памяти и др.).
Загрузка программ в оперативную память и их выполнение.
Стандартизованный доступ к периферийным устройствам (устройства ввода-вывода).
Управление оперативной памятью (распределение между процессами, организация виртуальной памяти).
Управление доступом к данным на энергонезависимых носителях (таких как жёсткий диск, оптические диски и др.), организованным в той или иной файловой системе.
Обеспечение пользовательского интерфейса.
Сетевые операции, поддержка стека сетевых протоколов.
Операционные системы могут иметь различную структуру (архитектуру). Различают монолитные системы, системы, основанные на микроядре, экзоядре и многоуровневые. Все наиболее популярные ОС общего назначения (Win, Unix) имеют многоуровневую структуру. Остальные варианты относятся, в основном, к ОС реального времени.
Многоуровневая структура - ОС как иерархия уровней. Уровни образуются группами функций операционной системы - файловая система, управление процессами и устройствами и т.п. Каждый уровень может взаимодействовать только со своим непосредственным соседом - выше- или нижележащим уровнем. Прикладные программы или модули самой операционной системы передают запросы вверх и вниз по этим уровням.
10 Наследование конструктор по умолчанию назначение вызовы в явном виде конструктора наследуемого класса
Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку . Конструктор по умолчанию:
Конструктор может иметь аргументы по умолчанию
X (int=0)
X (int j=1; float k=21);
При вызове конструктора следует избегать неоднозначностей.
X mx(1,2); правильно
X mx(1); неправильно
X mx;неправильно
Наследованный класс или интерфейс будет содержать в себе всё, что указано для всех … В этом проявляется отличие классов от других типов данных — вызов конструктора обязателен. … Однако в явном виде удалить ссылку на объект (экземпляр класса или сам класс) можно так
11. Наследование. Проблема тождественности имен членов классов. Реализация. Примеры примененния.
Наследование – это один из механизмов объектно-ориентированного программирования. Важно заметить, что в наше время практически каждый современный язык поддерживает эту парадигму. Но стоит сказать, что в C++ есть некоторые особенности в возможностях этого механизма.
Реализация и примеры.
При помощи этого механизма строится иерархия классов. Но стоит с осторожностью оперировать им. Например, вы создали класс TextBox. В довесок был также создан класс TextBoxInfo, содержащий различные вспомогательные методы, которые по какой-то причине оказываются очень полезны основному классу TextBox. Ну и отлично: унаследуем класс TextBoxInfo для получения доступа к реализации этих самых методов:
class TextBoxInfo
{
public:
TextBoxInfo(){ /*…*/ } virtual ~TextBoxInfo(){ /*…*/ }
virtual void doSmthWithText(){ /*…*/ } // …
};
class TextBox: private TextBoxInfo { /*…*/ }; |
Проблема тождественности имен членов классов
проблема в совпадающих именах методов. При вызове C::doSmth() появится неопределенное поведение, т.к., по идее, не понятно, какой экземпляр метода вызвать: из класса A или класса B. Одно из решений – это явно указать, что вы хотите использовать именно какую-то конкретную реализацию метода:
C some;
some.B::doSmth(); |
Приемлемое решение проблемы, но только в том случае, когда doSmth объявлена как public в интересующем нас классе.
Другое решение проблемы – использовать виртуальное (virtual) наследование. Но стоит отметить, что сам механизм полиморфизма всегда снижает скорость работы программы и количество съедаемой памяти. Виртуальное наследование – не исключение. Стоит несколько раз подумать, прежде чем его использовать.
12. способы построения новых классов из существенных ранее. Агрегация (включение). Функциональное назначение. Реализация. Примеры применения. Отличия от наследования. Жизненный цикл агрегируемых объектов.
Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса. Например, предположим, что у вас есть базовый класс employee:
class employee
{ public: employee(char *, char *, float); void show_employee(void); private: char name[64]; char position[64]; float salary; };
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.
class Professor;
class Department
{
private:
Professor* members[5];
};
замена вложенных объектов на стадии выполнения программы позволяет динамически изменять её поведение. Механизм наследования такой гибкостью не обладает, поскольку для производных классов устанавливаются ограничения, проверяемые на стадии компиляции.
Как и у кешируемых отделяемых интерфейсов, у агрегируемых объектов жизненный цикл и характеристики подчинены жизненному циклу и характеристикам внешнего управляющего объкта.
13.
Методы классы- это функции, взодящие в состав класса. Класс smallodj содержит два метода: setdata() и showdata(). Тела обоих методов состоят из одного оператора, который записан на одной строке с фигурными скобками, ограничивающими тело функции. Разумеется, можно использовать и более традиционный способ оформления функций:
Void setdata(int d)
{
Simedata = d;
}
И
Void showdata()
{
Cout <<”\nЗначение поля равно “<<somedata^
}
В тех случаях, когда тела методов невелики по размеры, имеет смысл использовать более сжатую форму их записи.
По скольку методы setdata() и showdata() описаны с ключевым словом public , они доступны за пределами класса smallobj.
Метод в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-то классу или объекту.
Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какого-то действия, имеет набор входных аргументов и возвращаемое значение .
Чтобы понять, для чего же в действительности нужны классы, проведём аналогию с каким-нибудь объектом из повседневной жизни, например, с велосипедом. Велосипед — это объект, который был построен согласно чертежам. Так вот, эти самые чертежи играют роль классов в ООП. Таким образом классы — это некоторые описания, схемы, чертежи по которым создаются объекты. Теперь ясно, что для создания объекта в ООП необходимо сначала составить чертежи, то есть классы. Классы имеют свои функции, которые называются методами класса. Передвижение велосипеда осуществляется за счёт вращения педалей, если рассматривать велосипед с точки зрения ООП, то механизм вращения педалей — это метод класса. Каждый велосипед имеет свой цвет, вес, различные составляющие — всё это свойства. Причём у каждого созданного объекта свойства могут различаться. Имея один класс, можно создать неограниченно количество объектов (велосипедов), каждый из которых будет обладать одинаковым набором методов, при этом можно не задумываться о внутренней реализации механизма вращения педалей, колёс, срабатывания системы торможения, так как всё это уже будет определено в классе. Разобравшись с назначением класса, дадим ему грамотное определение.
Реализация класса - это способ осуществления работоспособности класса. До этого мы не отделяли интерфейс класса от его реализации, то есть реализация методов осуществлялась внутри класса. Отделение интерфейса от реализации класса выполняется для того, чтобы скрыть способ осуществления работоспособности класса. Отделение интерфейса от реализации выполняется за 5 шагов:
1.добавить в проект заголовочный файл *.h;
2.определить интерфейс класса в заголовочном файле
3.добавить в проект исполняемый файл *.cpp;
4.в исполняемом файле выполнить реализацию класса;
5.подключить заголовочный файл к программе.
14
Полиморфи́зм (от греч. πολὺ- — много, и μορφή — форма) в языках программирования — возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования[1].
Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».
Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием).
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение:
внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и/или сигнатурами (именами методов, типами аргументов и их количеством);
внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).
Примеры
Класс геометрических фигур (эллипс, многоугольник) может иметь методы для геометрических трансформаций (смещение, поворот, масштабирование).
Класс потоков имеет методы для последовательной передачи данных. Потоком может быть информация, вводимая пользователем с терминала, обмен данными по компьютерной сети, файл (если требуется последовательная обработка данных, например, при разборе исходных текстов программ).
В объектно-ориентированных языках
В объектно-ориентированных языках класс является абстрактным типом данных.[Прим. 1] Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнения для экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]
Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.
Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.
Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая «Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема путём отказа от множественного наследования для классов и разрешением множественного наследования для полностью абстрактных классов (то есть интерфейсов) (C#, Delphi, Java), либо через виртуальное наследование (C++).
В функциональных языках
Полиморфизм в функциональных языках будет рассмотрен на примере языка Haskell.
В Haskell существует два вида полиморфизма — параметрический (чистый) и специальный, (на основе классов[Прим. 2]). Специальный называют еще ad hoc (от лат. ad hoc — специально). Их можно отличить следующим образом:
[править]Параметрический полиморфизм
В случае параметрического полиморфизма функция реализована для всех классов одинаково, и, таким образом, реализована вообще для произвольного типа данных. Например, функция сортировки одинакова для данных любого типа, если функция сравнения данных задана отдельно. См. также Метапрограммирование.
[править]Специальный полиморфизм
Специальный (или лат. ad hoc) полиморфизм допускает специальную реализацию для данных каждого типа. Например, используемая в нашем примере функцией сортировки функция сравнения должна быть определена по-разному для чисел, кортежей, списков, т. е. она является специально полиморфной.[источник не указан 973 дня]
В Haskell есть деление на классы и экземпляры (instance), которого нет в ООП. Класс определяет набор и сигнатуры методов (возможно, задавая для некоторых или всех из них реализации по умолчанию), а экземпляры реализуют их. Таким образом, автоматически отпадает проблема множественного наследования. Классы не наследуют и не переопределяют методы других классов — каждый метод принадлежит только одному классу. Такой подход проще, чем сложная схема взаимоотношений классов в ООП. Некоторый тип данных может принадлежать нескольким классам; класс может требовать, чтобы каждый его тип обязательно принадлежал к другому классу, или даже нескольким; такое же требование может выдвигать экземпляр. Это аналоги множественного наследования. Есть и некоторые свойства, не имеющие аналогов в ООП. Например, реализация списка, как экземпляра класса сравнимых величин, требует, чтобы элементы списка также принадлежали к классу сравнимых величин.
Программистам, переходящим от ООП к ФП, следует знать важное отличие их системы классов. Если в ООП класс «привязан» к объекту, т. е. к данным, то в ФП — к функции. В ФП сведения о принадлежности к классу передаются при вызове функции, а не хранятся в полях объекта. Такой подход, в частности, позволяет решить проблему метода нескольких объектов (в ООП метод вызывается у одного объекта). Пример: метод сложения (чисел, строк) требует двух аргументов, причем одного типа.