лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 11
Текст из файла (страница 11)
Чтобы выделитьместо в динамической памяти,нужно использовать операцию«new»Ещё раз о структура в Си#:struct Name // не имеет ссылочной семантики{….<определения членов>….}…….Name x;// память отводится здесь жеx = new Name(<параметры>); // Явное выделение динамической памятиName [] arr = new Name[50];// В памяти отведётся место под 50 объектов типа «Name»,//а не под 50 указателейОт структур нельзя наследовать.
Сами структуры неявно наследуются от класс System.StructОбращение«имя_объекта».«имя_члена»Для членов-данных по определению выполнение операции обращения к элементу класса «.»(class memberacces operator) является просто смещением относительно адреса «this»(«self»)class X{….объявления \ определения для Си++, определения для C#, Java…..}Внутри всех функций-членов члены класса видимы непосредственно.Однако формальные параметры метода класса относятся к блоку метода и могут закрывать члены класса.Тогда доступ к членам классам можно получить через указатель this при помощи операции обращение кэлементу класса «.»: this.«имя члена».В Delphi формальные параметры функций-членов находятся в той же области видимости, что и все остальныечлены класса и, следовательно, не могут с ними совпадать.Члены-типыSTL – набор соглашений.
Одно из соглашений – контейнеры должны сами себя описывать. В Delphi членовтипов нет.Статические членыSmallTankclass variableinstance variableclass variable – члены-данные класса, которые принадлежат всем экземплярам класса.instance variable – принадлежат экземплярам класса, у экземпляра своя instance variable.С точки зрении Си++ статические члены классов отличаются от глобальных только областью видимости.class T{….static int x;static void f();……}…T t;t.x;//операция доступа//или, что тоже самоеT::x//операция разрешения видимостиt.f();//операция доступа//или, что тоже самоеT::f() //операция разрешения видимостиВ C#,Java,Delphi обращение к статическим членам происходит только через тип класса.В статических функциях нет ths/self => в них нельзя использовать нестатические члены класса, т.к.
поумолчанию все обращения к нестатическим членам идут через указатель ths/selfВ C#, Java статические члены используются намного чаще, чем в Си++, Delphi, т.к. в C#, Java нет глобальныхфункций и переменных:public class Name{….public static void Main(string [] args)….}Паттерн Singleton (Одиночка)Если установка соединения между клиентом и сервером слишком трудна, требует больших затрат ресурсов ивремени, то неэффективно каждый раз устанавливать его заново. Нужно иметь единственный экземплярсоединения и запретить произвольное создание экземпляров (для этого можно, например, сделатьконструктор приватным).class Singleton{static private Singleton *Instance;//объявление, не путать с определениемprivate:Singleton();Singleton(const Singleton &);public:static getInstance(){if(Instance == NULL)Instance = new Singleton(); //здесь нужен конструкторreturn instance; //здесь нужен конструктор копирования}}Определение объекта подразумевает размещение его в памяти.Т.к.
внутри класса имеется только объявление static private Singleton *Instance, то где-то вне класса нужнопроизвести определение этого статического члена:Singleton * Singleton::Instance = NULL; //отличается от определения (размещения)глобальной переменной только тем, что кромеэтого места Singleton::Instance нигденельзя будетдалее использовать, т.к. это скрытый член класса.Это единственный случай, когда можно инициализировать скрытые члены классаВложенные типы данных (классы)class Outer{….class Inner{//Inner – обычный класс, но с ограниченной областью//видимости…..};….};Все классы являются статическими членами.
Ко всем именам правила прав доступа применяются одинаково,т.е. специфика имени не участвует в разрешении прав доступа.C#В C# имеется понятие «статического класса»static class Mod{public static void f () { ….;}public static int i;}Статический класс – служит контейнером для статических членов. От статических классов нельзя наследовать.Нельзя создавать объекты статических классов.
Статические классы подчёркивают их чисто модульнуюприроду.Без «static» - обычный класс в понятии Си++. На вложенность классов не влияет.Статические члены – набор ресурсов, независимых от какого-либо экземпляра.JavaСтатический импорт – импорт всех статических членов класса. Часто применяется к математическимфункциям.Статические классы в Java:public class Outer{….public static class Inner{//Тоже самое, что и в C#, C++ без «static»…..};….};Это сделано для того, что доступ к Inner был через OuterДекларируются внутри основного класса и обозначаются ключевым словом static.
Не имеют доступа к членамвнешнего класса за исключением статических. Может содержать статические поля, методы и классы, вотличие от других типов внутренних классов в языке Java.Внутренние классы в Java: без «static»public class Outer// «Outer» является владельцем «Inner»{….static class Inner{…..};….};//Тоже самое, что и в C#, C++ без «static»Декларируются внутри основного класса. В отличие от статических внутренних классов, имеют доступ кчленам внешнего класса, например «Outer.this». Не могут содержать определение (но могут наследовать)статических полей, методов и классов (кроме констант).ИнкапсуляцияЕдиница защиты – тип класса или экземпляр классаАтом защиты – член класса.В современных языках единицей защиты является тип класса.
Правила защиты во всех языках определяютсядля всех экземпляров одинаково. Нельзя один экземпляр защитить больше чем другой.Управление инкапсуляцией:••Управление доступом – C++, C#, DУправление видимостью – JavaУправление видимостью – «private»-членов как бы просто нет для других классов, они «невидимы».Управление доступом – все не скрытые (не переопределённые) члены видны, т.е. компилятор постоянно«знает» об их существовании, но при обращении проверяются права на доступ. При попытке обращения кнедоступному члену выдаётся ошибка.class X{public:virtual void f();void h();};class Y: public X{private:virtual void f();void h();};class Z: public Y{public:virtual void f();//В Java заместится функция, видимая в данный момент – X::fvoid g(){ … h();….
} //В Си++ для этой строчки будет выдана ошибка – с точки зрения управлениядоступом попытка вызова функции Y::h() незаконна, т.к. она приватна(к ней нет доступа вне класса Y).В Java спокойно вызовется функция X::h() и никакой ошибки не будет, т.к.функция Y::h() просто вычеркнута израссмотрения (невидима)}Три уровня инкапсуляции:1. public2. private3. protected«свой» - член данного класса«чужой» - все внешние классы«свои» - члены наследованных классовpublic разрешает доступ всемprivate разрешает доступ только «своему»protected разрешает доступ «своим» и «своему»class X{….protected: void f();……};class Z:public X{….…..};class Y:public X{void g(){f(); //так можноY another;another.f(); // так тоже можноZ getanother;getanother.f(); // В C# и Java так нельзя (у класса Y и класса Z независимые контрактыX).
В C++ так можно(X)getanother.f(); // В C# и Java так будет работать (в C++ и подавно)};Перегрузка операцийa += b;// ~a.operator+=(b)a + b;Есть два пути вычисления этого выражения:a.operator+(b);илиoperator+(a,b);class X{public:X operator+(X & a);X(T);// с классом};//либоX operator +(X & a, X & b);T t;X a,b;a = a + b;a = t + b;// ищет T.operator+(X), operator+(T,X) и т.д.Правильным является operator+(X(T),T)Если требуется, чтобы доступ к приватным членам был не только у «своего», можно для этой этого объявитьнужную дружественную конструкцию в теле класса:friend «объявление друга»;// Можно писать сразу определение.
Другом может бытьфункция или целый классfriend «прототип глобальной функции»friend «прототип функции-члена другого класса»friend class «имя класса-друга»;// Все методы этого класса становятся дружественнымиВ Delphi, C#, Java друзей нетВ них реализованы этот механизм реализован немного по-другому:DelphiUNITJavapackageC#assemblyВ Java по умолчанию пакетный доступ. Это значит, что использовать класс может каждый класс из этогопакета. Если класс объявить как «public class …», то он будет доступен и вне пакета.
Использовать класс –наследовать, создавать объекты.C#:Сборка – надъязыковое понятие в .NerFramework. Сборка представляет собой совокупность файлов +манифест сборки, Любая сборка, статическая или динамическая, содержит коллекцию данных с описаниемтого, как ее элементы связаны друг с другом. Эти метаданные содержатся в манифесте сборки. Манифестсборки содержит все метаданные, необходимые для задания требований сборки к версиям и удостоверениябезопасности, а также все метаданные, необходимые для определения области действия сборки и разрешенияссылок на ресурсы и классы.Внутри сборки идёт разделение на пространства имён, которые содержат описания классов.Для использования какого-либо пространства имён нужно сначала подключить сборку, содержащую его.Пространство имён может быть «размазана» по нескольким сборкам.В C# для членов классов имеются следующие квалификаторы доступа:• public• private // по умолчанию• protected• internal – член доступен только в классах из сборки• internal protected – член доступен только в классах-наследниках, находящихся в сборкеДля самих классов:••public – класс можно использовать в любых классахinternal – класс можно использовать только в классах из его сборки (по умолчанию)public class X //Этот класс может унаследовать любой класс{….internal int a; // Это переменная доступна только внутри сборки….}internal class Y //Этот класс может унаследовать только класс из сборки{….}Delphitype T = class….
// здесь объявляются члены, видимые везде их данного модуля и не видимые// другихpublic….protected….private…..end;UNIT – единица дистрибуцииСпециальные функцииФункции-члены, обладающие семантикой обычных функций-членов, о которых компилятор имеетдополнительную информацию.Конструктор – порождение, инициализацияДеструктор – уничтожение (В Java и C# не деструкторов, вместо это можно сделать собственный методDestroy() )Управление жизненным циклом объекта•••создание, инициализацияиспользованиеуничтожениеУ конструктора нет возвращаемого значения.Т.к.