- •Какие новые синтаксические элементы появились в объектно-ориентированных языках программирования? Приведите примеры (умк);
- •1)Декларации классов и объектов (и все, что с ними связано);
- •7)Механизм обработки исключений.
- •Языковые средства описания классов и объектов (умк);
- •Int value;
- •Int get_value(void){ return value; }
- •Int last_value(void);
- •Иерархия классов (умк);
- •Способы создания и разрушения объектов (умк);
- •Void out(void){ puts(p); }
- •Void main(){
Иерархия классов (умк);
Иерархия классов – это структура, состоящая из классов, связанных между собой отношением обобщения. Обобщение и наследование позволяют выявить аналогии между различными классами объектов, определяют многоуровневую классификацию объектов. Так, в графических системах могут существовать классы, определяющие обрисовку различных геометрических фигур: точек, линий (прямых, дуг окружностей и кривых, определяемых сплайнами), многоугольников, кругов и т.п. Обобщение позволяет выделить класс одномерные фигуры и считать классы прямая, дуга и сплайн подклассами класса одномерные фигуры, а класс одномерные фигуры - суперклассом классов прямая, дуга и сплайн. Легко видеть, что отношения "подкласс - суперкласс" (обобщение) и "суперкласс - подкласс" (наследование) транзитивны, что позволяет строить классификационные деревья.
Для начала рассмотрим пример объявления нескольких классов. В этом примере задаются отношения наследования между тремя классами (классы A, B, C). При этом C наследует свойства класса B, который, в свою очередь, является наследником класса A. В этом примере все члены классов объявляются со спецификатором public, к которому мы пока относимся (пока!) как к должному. В этих классах мы объявим самые простые варианты конструкторов и деструкторов. В настоящий момент нам важно исключительно их существование. #include <iostream.h>
class A {
public:
A(){};
~A(){};
int x0; int f0 () {return 1;};
class B : public A {
public:
B(){};
~B(){};
int x1;
int x2;
int xx;
int f1 () {return 100;};
int f2 () {return 200;};
};
class C : public B {
public:
C(){};
~C(){};
int x1;int x2;int x3;
int f1 () {return 1000;};
int f3 () {return 3000;};
void main () {
C MyObject;}
Перед нами пример простого наследования. Каждый производный класс при объявлении наследует свойства лишь одного базового класса. В качестве базового класса можно использовать лишь полностью объявленные классы. Неполного предварительного объявления здесь недостаточно.
Класс может иметь одного или нескольких родителей или не иметь их вовсе Класс, у которого нет родителей, но есть потомки, называется базовым (base) или корневым (root), а тот, у которого нет потомков, - листовым (leaf). О классе, у которого есть только один родитель, говорят, что он использует одиночное наследование (Single inheritance); если родителей несколько, речь идет о множественном наследовании (Multiple inheritance).
В C++ различаются непосредственные и косвенные базовые классы. Непосредственный базовый класс упоминается в списке баз производного класса. Косвенным базовым классом для производного класса считается класс, который является базовым классом для одного из классов, упомянутых в списке баз данного производного класса. В нашем примере для класса C непосредственным базовым классом является B, косвенным - A.
Способы создания и разрушения объектов (умк);
Как отмечалось выше объекты создаются как переменные соответствующих типов (в качастве типа указывается класс объекта):
Light lt; В процессе создания и удаления объектов в программе обязательно участвуют особые методы класса – конструктор и деструктор, назначение которых интуитивно понятно.
Конструктор – выделяет память для объекта и инициализирует данные-члены класса.
имя конструктора совпадает с именем класса;
конструктор не имеет возвращаемого значения (даже void);
классу без конструктора предоставляется конструктор по умолчанию;
при явно описанном конструкторе конструктор по умолчанию не генерируется;
конструкторы могут быть перегружены;
не могут быть описаны с ключевыми словами virtual, static, const, mutable, volatile;
не могут явно вызываться в программе;
частным случаем конструктора является конструктор копирования, у которого в аргументах передается ссылка на другой объект того же класса.
Деструктор – вызывается автоматически при разрушении объекта, его задача - освободить память и корректно уничтожить объект. имя деструктора также совпадает с именем класса но предваряется символом тильда "~" (~имя_класса);деструктор не имеет ни какого возвращаемого значения;не может быть описан как static, const, mutable, volatile;без явного задания генерируется деструктор по умолчанию;могут быть описаны как virtual - у всех производных классов деструкторы автоматически будут виртуальными;могут явно вызываться;
Ниже приведем объявление конструктора: ComplexType();
Определение пустого конструктора: ComplexType() { }
Как известно, в классе может быть не объявлено ни одного конструктора. В таком случае транслятор без участия программиста самостоятельно строит стандартный конструктор. Не существует классов без конструкторов, хотя классы с автоматически создаваемыми конструкторами, как ни странно, называются классами без конструкторов.
В классе может быть объявлено (и определено) несколько конструкторов. Их объявления должны различаться списками параметров. Такие конструкторы по аналогии с функциями называются перегруженными (или совместно используемыми). Транслятор различает перегруженные конструкторы по спискам параметров. В этом смысле конструктор не отличается от обычной функции-члена класса:
ComplexType(double rePar, double imPar); /* Объявление… */
ComplexType(double rePar, double imPar) { /*…*/ } /*Определение…*/
Конструктор вызывается не для объекта класса, как другие функции-члены, а для области памяти. Для её преобразования ("превращения") в объект класса.
Конструктор копирования (пример):
class demo {
char *p;
public:
demo(void) { p="NULL"; }
demo(char* s){ p=s; }
demo(demo& demo_o){ p=o.p; }