Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФОРМАТИКА 2012 35 (2003).doc
Скачиваний:
14
Добавлен:
28.09.2019
Размер:
156.67 Кб
Скачать

Описание функций в теле класса

В теле класса можно указать только заголовок функции, а можно описать всю функцию (см. пример с функцией Alloc ниже. В этом случае она считается встраиваемой (inline))

Константные функции-члены

Нестатические функции-члены (и только они) могут иметь описатель const

class Array

{

...

inline double operator[] (int n) const;

Такие функции не имеют права изменять поля класса (кроме полей, определённых как mutable). Если они пытаются это сделать, компилятор должен выдать сообщение об ошибке.

2. Операции в языке С++.

7. C++. Инкапсуляция. Объявление области видимости

Основным способом организации информации в Си++ являются классы. В отличие от типаструктура (struct) языка Си, которая может состоять только из полей и вложенных типов, класс (class) Си++ может состоять из полей, вложенных типов и функций-членов (member functions). Члены класса бывают публичными (открытыми, public), защищёнными (protected) и собственными (закрытыми, приватными, private). В Си++ тип структура аналогичен типу класс, отличие в том, что по умолчанию члены и базовые классы у структуры публичные, а у класса — собственные.

С открытыми (публичными) членами класса можно делать снаружи класса всё, что угодно. К закрытым (приватным) членам нельзя обращаться извне класса, чтобы не нарушить целостность данных класса. Попытка такого обращения вызовет ошибку компиляции. К таким членам могут обращаться только функции-члены класса (а также так называемые функции-друзья и функции-члены классов-друзей; о понятии друзей в C++ см. ниже). Помимо открытых и закрытых членов класса, могут быть ещё и защищённые — это члены, доступные содержащему их классу, его друзьям, а также производным от него классам. Такая защита членов называется инкапсуляцией.

Используя инкапсуляцию, автор класса может защитить свои данные от некорректного использования. Кроме того, она задумывалась для облегчения совместной разработки классов. Имелось в виду, что при изменении способа хранения данных, если они объявлены как защищённые или собственные, не требуется соответствующих изменений в классах, которые используют изменённый класс. Например, если в старой версии класса данные хранились в виде линейного списка, а в новой версии — в виде дерева, те классы, которые были написаны до изменения формата хранения данных, переписывать не потребуется, если данные были приватными или защищёнными (в последнем случае — если использующие классы не были классами-наследниками), так как ни один из них этих классов не мог бы напрямую обращаться к данным, а только через стандартные функции, которые в новой версии должны уже корректно работать с новым форматом данных. Даже оператор доступаoperator [] может быть определён как такая стандартная функция.

8. C++. Полиморфизм. Перегрузка операций и методов.

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

Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.

Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.

Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая «Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема через виртуальное наследование (C++).

9. C++. Наследование. Ограничения при наследовании.

class A{ //базовый класс

};

class B : public A{ //public наследование

};

class C : protected A{ //protected наследование

};

class Z : private A{ //private наследование

};

В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:

Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.

Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.

Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.

10. С#.Классы.Опр-е классов. Классы-сердце каждого ООЯ. Класс представляет собой инкапсуляцию данных и методов для их обработки.Это справедливо для любого ООЯ.Языки отлич-ся в этом плане лишь типами данных,хранимых в виде членов,а также возможностями классов.В том,что касается классов и многих ф-ций языка,С# кое-что заимствует из C++ и Java и привносит новое помогающее найти элегантные решения.Опр-е классов.Синтаксис опр-я классов на С# прост.Поместив перед именем класса ключ.слово class, вставьте члены класса,заключенные в фигурные скобки. Состав классов.Поле.Так наз-ся член-переменная, содержащий нек.зн-е.В ООП поля иногда наз-т данными объекта.К полю можно применять несколько модификаторов в зависимости от того,как вы собираетесь его исп-ть.В число модификаторов входят static,readonly и const.Метод.Это реальный код,воздействующий на данные объекта (или поля).Здесь мы сосредоточимся на определении данных класса.Свойства.Их иногда называют «разумными» полями (smart fields),поскольку они на самом деле явл-ся методами, кот.клиенты класса восприним-т как поля.Это обеспечивает клиентам большую степень абстрагирования за счет того,что им не нужно знать,обращаются ли они к полю напрямую или через вызов метода-аксессора.Константы.Как можно предположить,исходя из имени,константа-это поле,зн-е кот. изм-ть нельзя.Индексаторы.Если св-ва-это «разумные» поля, то индексаторы-это «разумные» массивы,так как они позв-т индексировать объекты методами-аксессорами get и set.С помощью индексатора легко проиндексировать объект для установки или пол-я зн-й.События.Событие вызывает исполнение нек.фрагмента кода.События-неотъемлемая часть программ-я для Microsoft Windows.

С#.Классы.Опр-е членов классов.

Члены классов.Классы-сердце кажд. ООЯ.Класс представ-т собой инкапсуляцию данных и методов для их обработки. Класс опр-ся как список своих членов.К членам класса отн-ся его поля(св-ва) и ф-ции(методы).Кажд.члену класса можно установить его область доступа.Область доступа члена класса опр-т участки кода,из кот.к этому члену будет возможно обращаться. Классы в языке C# опр-ся:public-Члены,доступные люб.классу программы;internal-члены, доступные люб.классу в том же модуле программы;internal protected-члены,доступные тек. классу и всем его подклассам в том же модуле программы;protected-члены,досутпные только тек.классу и всем его подклассам;private-члены, доступные только из тек.класса (тип по умолчанию). Поле.Так наз-ся член-переменная,содержащий нек.зн-е.В ООП поля иногда наз-т данными объекта.К полю можно применять несколько модификаторов в зависимости от того, как вы собираетесь его исп-ть.В число модификаторов входят static,readonly и const.Метод.Это реальный код, воздействующий на данные объекта (или поля).Здесь мы сосредоточимся на определении данных класса.Свойства.Их иногда называют «разумными» полями (smart fields), поскольку они на самом деле явл-ся методами,кот.клиенты класса воспринимают как поля.Это обеспечивает клиентам большую степень абстрагирования за счет того,что им не нужно знать,обращаются ли они к полю напрямую или через вызов метода-аксессора.Константы.Как можно предпол-ть, исходя из имени,константа-это поле,зн-е кот.изм-ть нельзя. Индексаторы.Если св-ва-это «разумные» поля,то индексаторы-это «разумные» массивы,так как они позволяют индексировать объекты методами-аксессорами get и set.С помощью индексатора легко проиндексировать объект для установки или пол-я зн-й.События.Событие вызывает исполнение нек.фрагмента кода.События-неотъемлемая часть программ-я для Microsoft Windows.

C#.Классы.Типы конструкторов.

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

Констр-р инициализирует объект при его создании.Он имеет такое же имя,что и сам класс,а синтаксически подобен методу.Однако в опр-ии конструкторов не указ-ся тип возвращаемого зн-я.Формат записи конструктора такой:

доступ имя_класса () {

// тело конструктора }

Обычно конструктор исп-ся,чтобы придать переменным экземпляра,определенным в классе,нач.зн-я или вып-ть исх.действия,необходимые для созд-я полностью сформированного объекта.Кроме того,обычно в качестве эл-та доступ исп-ся модификатор доступа public,поскольку констр-ры вызываются вне их класса.Все классы имеют конструкторы независимо от того,определите вы их или нет,поскольку С# автоматически предоставляет конструктор по умолчанию,кот.инициализирует все переменные-члены имеющие тип зн-й,нулями,а переменные-члены ссылочного типа-null-зн-ями.Но если вы определите собств.констр-р,констр-р по умол-ю больше не исп-ся.Параметризованные конструкторы.Параметры вносятся в конструктор точно так же,как в метод:для этого достаточно объявить их внутри круглых скобок после имени конструктора.Статические конструкторы.Конструктор класса можно объявить статическим.Стат. констр-р обычно исп-ся для нициализации атрибутов,кот.примен-ся к классу в целом,а не к конкрет-му его экземпляру.Стат.констр-р служит для инициализации аспектов класса до создания объектов этого класса.Стат. констр-р вызывается автоматически,причем до вызова констр-ра экземпляра.В общем случае static-констр-р будет выполнен до люб.констр-ра экземпляра.Кроме того,static-констр-ры должны быть закрытыми,и их не может вызвать программа.Деструкторы.Ср-ва языка С# позволяют опр-ть метод,кот.должен вызываться непосредственно перед тем,как объект будет окончательно разрушен с-мой сбора мусора. Этот метод наз-ся деструктором,и его можно исп-ть для обеспеч-я гарантии "чистоты" ликвидации объекта.Формат записи деструктора:

~имя_класса() {

// код деструктора }

Очевидно,что эл-т имя_класса здесь означает имя класса. Деструктор объявляется подобно констр-ру за исключением того,что его имени предшествует символ "тильда" (~). Деструктор не возвращает зн-я.Чтобы добавить деструктор в класс,достаточно включить его как член.Он вызывается в момент,предшествующий процессу утилизации объекта.В теле деструктора вы указываете действия, кот.должны быть выполнены перед разрушением объекта.

11. C#.Методы.

В типах int,string,Console,DateTime,Math и Random в качестве примеров исп-ия методов можно привести след.предлож-я:

offsetMeeting=meeting.AddHours(offset);

totalMins=int.Parse(Console.ReadLine());

В кажд.случае вызов метода сопровождается скобками даже при отсутствии параметров,как в случае ReadLine().Именно таким способом мы отличаем вызов метода от исп-я св-ва. Общ.форма объявления метода:модификатор_доступа тип_метода идентификатор_метода {параметры) {предложения и объявления переменных

return выр-е //Если тип.метод }

//Параметры

тип идентификатор,тип идентификатор…

Метод объявл-ся с указанием своего типа.В этом плане метод может быть типизированным(с именем нек.типа) или нетипизированным(типа void).Как и все члены,метод может быть закрытым(private) или открытым(public).По умолчанию назначается атрибут private.Методы могут содержать только переменные,но не константы.Если метод типизирован,в нем должно быть хотя бы одно предложение return с выр-ем,рез-т вычисления кот.имеет тот же тип,что и тип самого метода. Нетип.метод может иметь предложения return без выр-й. Переменные в методе не инициализированы и им следует явным образом присвоить зн-я перед их исп-ем.Переменные имеют область видимости,кот.действует только внутри метода;кажд.объявленное в методе имя имеет смысл только внутри этого метода.Тип.методы широко исп-ся в С#;их отличительной чертой явл-ся то,что они возвращают зн-е.Тип.метод обязательно должен сод-ть предложение return, следовательно,перед завершением он создает зн-е.Это треб-е соотв-т правилам его вызова.Вызов метода: идентификатор_метода (список__аргументов).Зн-я аргументов перед-ся параметрам метода;осущ-ся вход в метод,и его предложения вып-ся до конца метода или до предложения return.Нетип.(типа void) методы вызываются, как предложения: они не могут быть частью выр-й.Тип. методы вызываются,как часть выр-я,но их можно также вызывать и как предложения,однако в этом случае их возвращаемое зн-е теряется.В ООП методы исп-ся в нескольких разл.контекстах:ф-ции объекта,структурирование программы,обеспеч-е функц-х возможностей и стат.методы.

Еще одна класс-я методов заключ-ся в разделении всех методов на статические и методы экземпляра.Как и стат. поля,стат.методы объявляются с ключевым словом static и сущ-т для класса только в единственном экземпляре.Эти методы вызываются указанием их имени после имени типа и точки.Методы экземпляра относ-ся к конкретному экземпляру класса;их имена при вызове предваряются именем объекта и точкой.

12. Инкапсуляция-обеспеч-е скрытности данных,используемых в каком-либо классе.Модификаторы доступа в С# :public-Член доступен вне опр-я класса и иерархии производных классов; private-Член недоступен за пределами области видимости определяющего его класса,поэтому доступа к этим членам нет даже у производных классов;protected-Член невидим за пределами класса,к нему могут обращаться только производные классы;internal-Член видим только в пределах тек.единицы компиляции.Модификатор доступа internal в плане ограничения доступа явл-ся гибридом public и protected,зависимым от местоположения кода.Если вы не хотите оставить модификатор доступа для дан.члена по умолчанию (private),задайте для него явно модификатор доступа.Этим С# отлич-ся от C++,где член,для кот.явно не указан модификатор доступа,принимает на себя хар-ки видимости,определяемые модификатором доступа,заданным для предыд.члена.Для объявления членов на С# как public (член а)и protected (член d) необх-мо исп-ть след.инстр-цию:

class AccessCSharp {public int a;   protected int d;} В рез-те вып-я след.кода на С# член b объявляется как private (по умолчанию):

public DifAccessInCSharp {public int a;   int b;}