Классы


В общее меню

Введение

Основные
инструкции


Структурированные типы данных

Подпрограммы

Рекурсия

Классы

Динамические структуры данных

Сортировка
Сущность объектно-ориентированного подхода к программированию (Классы)

Основные идеи объектно-ориентированного подхода опираются на следующие положения:

  • Программа представляет собой модель некоторого реального процесса, части реального мира.
  • Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов.
  • Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект.
  • Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.
  • Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов.

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

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

Классы объектов часто удобно строить так, чтобы они образовывали иерархическую структуру. Например, класс “Студент”, описывающий абстрактного студента, может служить основой для построения классов “Студент 1 курса”, “Студент 2 курса” и т.д., которые обладают всеми свойствами студента вообще и некоторыми дополнительными свойствами, характеризующими студента конкретного курса. При разработке интерфейса с пользователем программы могут использовать объекты общего класса “Окно” и объекты классов специальных окон, например, окон информационных сообщений, окон ввода данных и т.п. В таких иерархических структурах один класс может рассматриваться как базовый для других, производных от него классов. Объект производного класса обладает всеми свойствами базового класса и некоторыми собственными свойствами, он может реагировать на те же типы сообщений от других объектов, что и объект базового класса и на сообщения, имеющие смысл только для производного класса. Обычно говорят, что объект производного класса наследует все свойства своего базового класса.


Введение в классы

Одним из наиболее важных понятий С++ является класс. Класс - это механизм для создания новых типов.

Синтаксис описания класса похож на синтаксис описания структуры.

	class Имя_класса
	{
	  закрытые элементы - члены класса
	public:
	  открытые элементы - члены класса
	};

На что здесь следует обратить внимание?

Имя_класса с этого момента становится новым именем типа данных, которое используется для объявления объектов класса.

Члены класса - это переменные состояния и методы этого класса, иными словами членами класса могут быть как переменные, так и функции. Функции и переменные, объявленные внутри объявления класса, становятся членами этого класса. Функции-члены класса будем называть методами этого класса.

По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми (private). Т.е. они доступны только из других членов этого класса. Для объявления открытых членов класса используется ключевое слово public. Все функции-методы и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.

Пример.

	class _3d 
	{ 
	  double x, y, z;
	public:
	  double mod ();
	  double projection (_3d r);
	};

В С++ для создания объектов традиционно принято использовать ключевое слово class.

Хотя функции mod() и projection(_3d r) объявлены в _3d, они еще не определены. Для определения метода - члена класса нужно связать имя класса, частью которого является метод, с именем класса. Это достигается путем написания имени функции вслед за именем класса с двумя двоеточиями. Два двоеточия называют операцией расширения области видимости.

	
	double _3d::mod ()
	{ 
	  return sqrt (x*x + y*y +z*z);
	} 
	
	double _3d::projection (_3d r)
	{ 
	  return (x*r.x + y*r.y + z*r.z) / mod();
	} 
	
	...
	
	main()
	{ 
	  _3d a, b; 
	  double dPro, dMod;  
	  dMod = a.mod(); 
	  dPro = b.projection(a); 
	}

Пример 1. Реализовать класс для работы с линейным массивом, обеспечить:

  • создание заполнением случайным образом или вводом с клавиатуры;
  • сортировка выбором;
  • вывод;
  • поиск минимального и максимального элементов.


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

В С++ определены два специальных типа методов – конструкторы и деструкторы. Конструкторы предназначены для инициализации элементов данных объектов. Деструкторы – для их удаления.

Описание конструктора:

	идентификатор_конструктора (список параметров) {тело конструктора}

Идентификатор конструктора должен совпадать с именем класса. У конструктора не указывается тип возвращаемого значения (даже void).

Для класса Massiv конструктор может быть объявлен так:

	Massiv (int *b, int m)
	{
	  n=m; 
	  for (int i=0; i<n; i++) 
	  	a[i]=b[i];
	}

Конструктор может иметь значения параметров по умолчанию.

Правила использования конструкторов:

- если конструктор не вызывается явно, то он вызывается автоматически при создании объекта с использованием значений параметров по умолчанию;

- если конструктор не описан явно, он генерируется транслятором автоматически.

Вызывать конструктор можно так:

	имя_класса имя_объекта = имя_конструктора (список фактических параметров);
	имя_конструктора имя_объекта (список фактических параметров);

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

Описание:

	~имя_класса () {операторы;}

Например:

	~Massiv () {};

Деструктор вызывается явно или неявно. Явно деструктор вызывается при необходимости уничтожения объекта.

Полиморфизм

Полиморфизм – многообразие форм. Это свойство, которое позволяет использовать одно имя для обозначения различных действий для одного или нескольких родственных классов.

К формам полиморфизма в С++ относятся:

  • перегрузка функций и операций;
  • виртуальные функции;
  • шаблоны – обобщение функций.

Перегрузка функций и операций – это статический полиморфизм, т.к. связи между функциями устанавливаются на этапе компиляции.

Перегрузка операций

С++ позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции. Это дает возможность использовать собственные типы данных точно так же, как стандартные. Обозначения собственных операций вводить нельзя.

При перегрузке унарной операции операндом является вызывающий класс.

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

Синтаксис:

	тип_результата operator операция(формальные_параметры);

Например,

	Massiv operator +(int k);

Пример 2.Реализовать класс для операций над числами в системе счисления с основанием р (1<p<10). Решить задачу: Дан массив чисел в р-ичной системе счисления. Найти НОД этих чисел.


Пример 3. Описать класс для работы с неотрицательными длинными числами и реализовать следующие операции:

  1. ввод числа;
  2. вывод длинного числа;
  3. операции отношения для длинных чисел;
  4. сложение;
  5. вычитание;
  6. умножение;
  7. деление.




Подборка примеров решения задач с использованием классов


Назад Вперед


Рейтинг ресурсов УралWeb

 

© Шестаков А.П., 2000-2007
Сайт создан в системе uCoz