Описание функций в теле класса
В теле класса можно указать только заголовок функции, а можно описать всю функцию (см. пример с функцией 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.