лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 12
Текст из файла (страница 12)
все объекты в C# и Java и Delphi размещаются в динамической памяти, то в этих языках обязательнаоперация явного размещения объектов:X = new X(); // В Си++ X * a = new X;Синтаксис конструкторов и деструкторов:C++. C#, Java, Dclass X{X(«параметры»);// В С# и Java обязательно определение тела}Delphitype X = classconstructor Create; // Имя конструктора произвольноеdestructor Destroy; // имя деструктора произвольноеend;…..a:X;….a := X.Create;В C++, C#, Java конструкторы не наследуются, но могут автоматически генерироваться компилятором поопределённым правилам.Классификация конструкторов:1. Конструктор умолчания X();2.
Конструктор копирования X(X &); X(const X & );3. Конструктор преобразования X(T); X(T &); X(const T &);В классах из простанства имён System платформы .NetFramework не определены конструкторы копирования.Вместо этого, если это предусмотрено проектировщиками, имеется метод clone();Лекция. Ульянов А.В.П.3. Специальные функции.Конструкторы. Классификация.Объект ссылка.Классификация (С++):1)2)3)4)КУКККПВсе остальное.Почему выделяем КУ в особый класс:X(){…} – выделяется.X(int) – нет.
(Java, C#)Конструкторы либо создаются, либо вызываются.Java, C#, D – в базовом типе object есть конструктор Create и деструктор Destroy. Соответственно здесь ничегосоздавать не надо, они уже есть и наследуются (если).X a; - подразумевается вызов конструктора по умолчанию (неявно).X a(); - нельзя, т.к. это прототип функции.X* px = new X; - нельзя в Java и С#, в С++ - можно.X* px = new X();class X{X();}Class Y:public X{Y(); //Y():X(){} – писать так явно, нельзя, но можно (если определено) Y():X(i){}}В С++: если нет конструктора, то будет сгенерирован.Как: вызов базового конструктора Х, затем под объект и только потом сам конструктор.В общем случае вид конструктора: заголовок [инициализация]Java, C#: Понятие КУ остается.Есть понятие инициализация объектов:class X{Z z = new Z(); // Z z; - значение неопределенно.Int I = 0;}Для базового должен быть конструктор.С#:Y(): base(0) {…} //base – конструктор базового типа.super – ссылка на базовый класс (Java)Вызов: super(…);Вызов конструктора базового класса только у первого оператора.
Если нет, то автоматически подставляетсяконструктор базового класса.КУ – не определяется явно.M-2, Ада:Init(); – явная инициализация.Destroy();КК: Параметр передается по значению.void f(X x);X f() {return X();}X a = b; //Вызов КК. ~ X a(b);Deep (глубокое) и Shallow (поверхностное) copy (копирование).int []a;int []b;a = new int[N];b = a; - поверхностное копирование.Побитовый КК:class X{… //В общем случае КК работает рекурсивно.}class Y: public X{Y Y(&y) {…} //Если этого нет, то вызывается базовый КК.}Общее правило: Если программист не обращается к базовому, то вызывается КК.Y Y(&y):X(y) {…} – КК от базового класса.С#: object.Protected ObjectMembeWizeClone(); По умолчанию копировать нельзя, но в произвольном классе можно самим переопределить.ICLoneable Clone();Java: Интерфейс-маркер.Сloneable; //Семантика зашита в компилятор.protected object Clone();Уровни поддержек:1) Полная поддержка копирования.Class X: Cloneable{ public object Clone() throws {…}}Допускается public X Clone() {…}2) Полный запрет состоит в том, что не реализован Cloneable.class X {public Object Clone() { throw CloneNotSupportedExeption; } }3) Условная поддержка:Для массива: сам массив может поддерживать, а его элементы:class X: Cloneable { public X Clone() throws CloneNotSupportedExeption {…} }4) Не наслед.
интерфейс Cloneableprotected object Clone() {…} //Поддерживает несколько операц. конструкт., не выбрасываетисключений.Метод копирования нельзя переопределять.D: inherited Create; //inherited – вызов соответствующего конструктора.С#: X Z::a(…);static X(…){…}static конструкторы нужны, когда не хватает инициализаторов.Деструктор – функция, которая вызывается автоматически, когда уничтожается объект.С++, D, C# - ОО модель.C#, Java – Автоматическая сборка мусора.D: objectFree, DestroyX := ICreate(…);x.Free;delete p;RAII:X(){RA}~X(){освобождение захваченных ресурсов}{…} освобождение захваченных ресурсов при выходе из блока.При динамической сборке мусора сложно определить, когда объект больше не используется.Image.FromFile(fname);…Image.SaveToFile(fname);Освободить файл можно, когда мы указываем, что с ним не буде работать.Т.е.
сборка мусора здесь не поможет.=> C#, Java:try{…} finally {…}D:try{…} finally…EndТо, что в блоке finally выполняется всегда, даже если было исключение.IDispose - общий интерфейс освобождения памяти.Dispose();try { im = … } finally {im.Dispose;}имя (инициализатор) блокT x = expr;X = expr;~try {инициализатор} finally {x.Dispose;}С#, Java: objectprotected void finalize();public void Close();Есть методики, которые позволяют возродить уничтоженный объект. Но finalize – полностью его удаляет(нельзя вызывать дважды).Close() – ресурсы освобождены.C#: ~X(){…} – нельзя вызывать явно.System.Object.finalize – можно вызвать явно.Сбощик мусора:mark_and_sweepЖивые и мертвые объекты (ссылки).Есть стек, в нем ссылки на объекты.
Если живой, то помечаем и заносим в таблицу живых объектов, остальные– мертвые, они-то и уничтожаются.Можно построить КЭШ объектов. Если объект мертвый, то нм нужен он. Но он еще не утилизирован (неуспели).Strong reference – на живой объект.Weak reference – объект готовится к уничтожение, не пока еще не нуничтожен.Java:Reference (Object o)get – выдает сильную ссылку.clear() – делает ссылку несильной.class DataFromFIle{Public void read() {… d = idData.get(); if (d!=null) return idData;//реальное чтениеidData = new …}Weak Reference idData; //в любой момент может быть уничтожен.
Если пока нет,//то get дает ссылку на объект и делает ее сильной, иначе – null.}Soft Reference(мягкая ссылка) – все ссылки считаются равноправными.Является разновидностью слабой, но удаляются из очереди с самой ранним временем загрузки (дольше всехне использовалась).Преобразования.Неявные (автоматически вставленные компилятором).Int longА может ли их задавать пользователь.C#, Java – неявные преобразования, задаваемые пользователем разрешены.Ф: v = expr – можно считывать различные типы данных.Действительные + комплексные:Ада: ToComplex(A) + x*i*ToComplex(f)*d + …* - можно перегрузить. Тогда в чем проблема?6 видов бинарных операций и много стандартных типов.
Только для умножения ~20. Итого ~120.А можно С*I -> d -> Complex.(d,0) – можно делать автоматически.С++: Страуструп ввел неявные преобразования:char* => string => …operator +(op) {…}C#:static operator+(T t1, T t2){…}static operator*(T t1, T t2){…}Недостаток С++:Class Vector{T* body;int size;public:Vector(int sz) {body = new[size = sz];}}Vector v(20); //okVector t(10);v = t;v =1; ~ v = Vector(1); // Вдруг описались, получилась чушь, но работать будет КП.еxpliced – снимает семантику КП (т.е. конструктор вызывается явно).V = Vecto(1);…C#: иначе,implicitеxplicit – по умолчанию.П.4.
Дополнительные возможности.Свойства (properties).С точки зрения операций – данные,С точки зрения реализации – get, set.D:T Get X() {return _x}void Set X (T value){_x = value;}C#:class X{T prop {get{…} set{…}} //value является зарезервированным в set.}…X a = new X();a.prop = t1;T t2 = a.prop;D:property prop: Tread – заголовок_getwrite – заголовок_setprivate _x: T;public published//все опубликованные свойства появляются в интегрированной среде разработки.property X: T read_x; write_x;C#: Нельзя переопределять [] => понятие индексатор:class X{T this(index){…}}class Outer{…}class Inner{…}Нестатический блок-класс имеет ссылку на Outer.thisInner in = this.newInner();Если public class Inner{…}Outer invoice;Inner = invoice.newInner();Iterable f(object[] objs){class Local: Iterable {int i; Local() {i = 0;}… if (i>objs) …}return new Local(C);}Имеет мест доступ к локальным переменным функции, если в данном блоке не изменяются.delegate int Processor(int i);Prcessor p = new Processor(func);Анонимные делегаты:P = new delegate(int i){…return k+ i;}Анонимные делегаты могут захватывать память.k =0;int j = P(3); //3k = -1;j = P(3); //2Лекция.
Сергеев Николай.«Объект обладает состоянием, поведением ииндивидуальностью».А.БучПримечание: В лекции использовались дополнительные материалы: обе книги Страуструпа(“языкС++” и “Эволюция и дизайн языка С++”), Wikipedia.org , google.ruДоброго времени суток, студенты ВМиК. Данная лекция является предпоследней в цикле лекций поЯзыкам Программирования, и сегодня мы поговорим об Объектно-ориентированном программировании.Надеюсь вы уже сталкивались с этим понятием, изучая материалы 4 семестра, и хорошо знаете чтопрограммировании на С++ подразумевает достаточное хорошее понимание основ объектноориентированного программирования. Ну если нет, то уверен, что после прочтения этой лекции, вы ужедостаточно хорошо будете владеть основами.
Ну что же приступим…Начнем с определения ООП (далее будем использовать такое сокращение для Объектноориентированного программирования):Объектно-ориентированное программирование (ООП) — парадигма программирования, в которойосновными концепциями являются понятия объектов и классов. Если для вас эти слова ничего не значат, торекомендуется вернутся на пару лекций назад и прочесть их, так как незнание такие фундаментальныхпонятий осложнит дальнейшее восприятие материала.Истоки ООП восходят к далеким 70-ым, во времена когда шло бурное развитие языковпрограммирования. Каждый день появлялся хотя бы один язык, и каждый день хотя бы один язык умирал. Вто смутное время группкой ученой была выдвинута идея ООП, которая была отчасти реализована в языкеСИМУЛА-67. Однако реализация та была далеко неполной, и понадобилось целых 13 лет, чтобы придти кпервой полной реализации ООП в языке SmaltalkНа сегодняшний день концепция ООП реализована в таких языках как С++, Java,C#,Ada,ObjectPascal,Turbo Pascal, Delphi, Oberon и в многих других.