Ссылочные классы и классы значений



Ссылочные классы: объявляются с помощью ключевого слова refclass и могут содержать такие члены как: конструкторы, методы, свойства и события. В конце объявлений объектов ссылочных классов (обычно это типы) используется оператор Дескриптора объекта (“^”), который по сути является указателем. Объекты ссылочного класса размещаются в динамической памяти с помощью ключевого слова gcnew. По определению класс ссылочный класс имеет семантику ссылки.

…То копируется не сам объект, а его дескриптор (ссылка). Когда создается экземпляр класса, то его память перед вызов конструктора инициализируется нулями. Поэтому такая инициализация для отдельных членов класса, включая свойства, не требуется

Классы значений: объявляются с помощью ключевого слова valueclass и в качестве членов могут содержать только поля. Когда переменная типа значения присваивается другой переменной, то ее значение копируется так, что каждая из 2х переменных содержит собственную копию данных.

Каждый класс может включать в себя различные члены класса, которыми могут быть: поля, свойства, методы, события.

Поля представляют собой обычные переменные, объявленные внутри класса. Поля, как и другие члены класса, являются закрытыми (локальными).

Битовые поля в классах: в С++ частным случаем класса является структура. Единственное отличие состоит в том, что доступ к членам структуры является открытым (глобальным), а доступ к членам класса по умолчанию является закрытым (локальным). Как в одном, так и в другом случае поведение по умолчанию можно изменить. Так же, как и в структурах допускается использование битовых полей. Битовые поля предоставляют доступ к отдельным битам, позволяя тем самым хранить в одной переменной несколько значений, занимающих указанное количество битов. Объявлении битового поля имеет следующий формат. В одном классе можно использовать одновременно битовые поля и обычные переменные члены. Доступ к переменной как к члену класса.

Определение свойств. Свойство является основным элементов инкапсуляции данных класса. Свойства обеспечивают корректный доступ к данным, определяющим внутреннее состоянии объекта. С точки зрения клиента объекта свойство выглядит и ведет себя аналогично общедоступному полю. Доступ к свойству организуется так же, как и доступ к общедоступному полю (глобальному) экземпляра класса (объекта). Однако, свойство не имеет никакого ассоциированного с ним места хранения в объекте. Свойство предоставляет средство доступа для чтения или записи поля. Типичный шаблон предусматривает обеспечение доступа к закрытому полю класса через общедоступное свойство. В среде visualstudio для определения свойства используется ключевое слово property. То есть свойство является членом либо ссылочного класса, либо класса значения. Имя свойства не может совпадать ни с именем соответствующего поля, ни с именем класса. Свойство может содержать 2 открытых метода функции (get и set) для обеспечения доступа к закрытому полю. Причем метод set не возвращает значения. Внутри методов доступа можно реализовать необходимую логику. Например, проверку входных данных для метода set. Вычисление значения с использованием значением свойства или вызов события при изменении свойства.

…Для хранения значения свойства, а затем реализовать базовую логику для сохранения и изменения значения с помощью специальных открытых методов (set и get). Соответственно метод set устанавливает в значение свойства некоторое значение, а метод get считывает это значение. Можно создавать свойства доступные только для чтения или только для записи, для этого в свойстве необходимо опустить соответствующий блок. Если свойство определяется только с блоком get, то такое свойство будет доступно только для чтения, а если с блоком set, то только для записи.

Метод определяет действие, которое можно выполнить над объектом или классом. Метод может возвращать значения определенного типа. Если метод не возвращает значения, то при его объявлении должно указываться void. Методы, как и обычные функции, могут иметь или не иметь параметры. Определение метода внутри класса осуществляется так же, как и определение обычной функции. Для вызова метода класса необходимо сначала создать экземпляр этого класса, а затем воспользоваться «точечной нотацией», при которой для указания метода используется имя класса и название метода, разделенные точкой. Обратиться к полю внутри метода явным образом можно через указатель, которые неявно передается в каждый метод. Доступ к полю в этом случае. При использовании в программе нескольких классов в которых содержатся методы, получающие в качестве параметра объекты другого класса может возникнуть не однозначная ситуация, в которой трудно определить, какой класс первичен, а какой вторичен. Чтобы избежать такой ситуации в языке с++ предусмотрено неполное объявление классов.

Различают статические и экземплярные методы класса. Отличия между ними состоит в том, что статические методы имеют доступ только к статическим членам класса и не имеют доступа к полям и метода экземпляра. А метод экземпляра имеет доступ как к статическим методам класса, так и к членам экземпляра класса. Обращение к статическим членам класса не требует предварительного создания экземпляра класса.

 

Перегрузка методов

С++ позволяет перегружать методы класса
Перегрузка – это предоставление нескольких определений для некоторого имени метода в одной области действия. При вызове метода компилятор выбирает требуемую его версию в зависимости от типа вызываемого метода, а также типа или количества параметров, содержащихся в методе.
Как правило, метод объявляется при определении класса, однако в языках VisualStudio также поддерживают методы расширения, которые позволяют добавлять методы в существующий класс вне определения класса.

 

Конструкторы и деструкторы

Чтобы при создании экземпляра класса (объекта) присвоить начальные значения каким-либо его членам, необходимо создать внутри класса метод, имеющий такое же название, как и название самого класса. Тип возвращаемого значения при этом не указывается. Такой метод называется конструктором. Конструктор всегда автоматически вызывается при создании объекта и выполняется всегда раньше всех остальных частей кода в классе. Конструктор может иметь перегруженные версии, отличающиеся типом параметров или их количеством. Если внутри класса нет конструктора, то автоматически создается конструктор без параметров. В этом случае объект может объявляться следующими способами
<имя_класса><имя_переменной>

<имя_класса><имя_переменной> = <имя_класса>()
Если внутри класса объявлен пользовательский конструктор, то конструктор по умолчанию не создается. Это означает, что если был создан конструктор с одним параметром, то при создании объекта обязательно нужно будет указывать этот параметр. Чтобы иметь возможность создания объекта без указания параметров, следует дополнительно создать конструктор без параметров. Если конструкторы вызываются при создании объектов, то деструкторы используются при уничтожении экземпляров класса (объектов). То есть они должны осуществлять действия, обратные реализуемым конструкторами, однако в платформе NetFramework за освобождение памяти для управляемых объектов приложение отвечает «сборщик мусора». А вот для очистки неуправляемы ресурсов, создаваемых приложением, могут понадобиться деструкторы. Например, они могут закрывать связанные с объектом файлов, разрывать связь с сервером/базой данных/другими компьютерами. На один класс связи допускается только один деструктор. Название деструктора так же совпадает с названием класса, но перед названием добавляется знак тильда. Тип возвращаемого значения так же не указывается. Деструктор нельзя вызвать непосредственно в программе – он автоматически вызывается «сборщиком мусора» при удалении объекта из динамической памяти. На практике освобождение ресурсов лучше осуществлять немедленно после того, как надобность в них отпадет. Конструкторы глобальных объектов (они располагаются после объявления класса) выполняются до передачи управления в функцию «main». Конструкторы же локальных объектов вызываются в порядке объявления объектов внутри функции. Вызовы же деструкторов производятся в обратном порядке.

Статические члены класса

Классы могут содержать статические поля, свойства и методы, которые доступны без создания экземпляра класса. Статические члены класса существуют в единственно экземпляре, независимо от количества созданных объектов. То есть все объекты класса имеют доступ к одним и тем же копиям таких данных. Объявление статических членов осуществляется с использованием ключевого слова static в качестве модификатора. Статические члены принадлежат не отдельному объекту, а классу как таковому, поэтому их объявление не является определением: они объявляются в области видимости класса, а их определение выполняется в области видимости файла. Таким образом, созданием статического поля выполняется в несколько этапов. Вначале поле объявляется внутри класса, далее производится его определение в глобальном пространстве, а затем в локальной области ему присваивается значение. Статическое поле по умолчанию инициализируется нулевым значением. Обращение к статическому члену внутри класса осуществляется так же, как к обычной переменной или к функции. Доступ извне к глобальному статическому члену класса может осуществляться и к как к нестатическому члену, то есть путем предварительного создания экземпляра класса и затем указания имени созданного объекта и оператора выбора члена (. /->) при названии члена при обращении к нему. Но возможен и другой способ, при котором перед обращением к члену класса не нужно создавать объект этого класса, а перед названием члена указать имя класса и оператор «::». Статические методы не имеют доступа к нестатическим членам класса. В С++ статический метод может быть вызван и через экземпляр класса.

11.05.18:Статические свойства могут обращаться только к статическим членам класса

 

Делегаты и события

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

Делегат в среде выполнения windows это особый тип ссылочного класса, который используется для вызова, предоставляемых клиенту функциях с совместимыми сигнатурами. Объявление делегата выглядит как прототип функции, которому предшествует ключевое слово delegate. Оно определяет имя ссылочного типа объекта делегата, а также сигнатуру функции (список параметров и тип возвращаемого значения), которое может быть ассоциировано (связано) с делегатом, потому делегаты может быть присвоен любой метод, соответствующий типу делегата из любого доступного класса. Делегаты представляют собой отличный механизм отделения вызываемого метода от вызывающего класса. Фактически код, вызывающий делегат, не имеет понятия, какой вызывается метод (экземпляра или статический) или из какого именно экземпляра производится вызов. Для вызывающего, когда это просто вызов произвольного кода. Он может получить экземпляр делегата любым способом при этом полностью абстрагируясь от сущности, которую он на самом деле вызывает.

При создании объекта делегата типа параметром конструктора служит адрес функции, которая получает нужный список параметров и имеет правильный тип возвращаемого значения. Такой функцией является функция sum являющаяся открытым (глобальным) членом класса, поэтому вызов делегата вызов функции sum для любого объекта этого класса. Когда вызывается несвязанный делегат, то первым параметром.

  

 

18.05.18:В программах пользователей можно организовать событийное управление. При чем не только к стандартным элементам управления, но и использовать события объектов, определенных пользователями

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

Функции, объявленные в классе и являющиеся … могут и не входить в этот класс, а объявляться в области видимости файла вместе с основной функцией main. В этом случае внутри функции main не нужно объявлять объект класса, содержащий функции обработчики. В следствии этого операторы добавления делегату функции-обработчика этот делегат будет иметь только один параметр, которым будет являться имя функции обработчика, соответствующего события

Класс издатель содержит объявления делегата и события, соответствующего делегату, а также метод Count, в котором будет производиться счёт до 100 и порождаться событие, достижения счётчиком значения 99. Функция messageявляется обработчиком события и предполагает вывод сообщения. В основной функции mainсоздается экземпляр класса (Count), а затем для события определяется функция, которая будет обрабатывать это событие.

Одиночное наследование является самой распространенной формой наследования при которой каждый производный класс имеет только один базовый класс.

При наследовании производный класс содержит все члены базового класса, а также те члены, которые в него добавлены. Кроме того, для изменения поведения унаследованного класса некоторые члены базового класса могут быть переопределены.

 

21.05.18:


Дата добавления: 2018-06-27; просмотров: 338; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!