Сущность объектно-ориентированного подхода к программированию (Классы)
Основные идеи объектно-ориентированного подхода опираются на следующие положения:
- Программа представляет собой модель некоторого реального процесса, части реального мира.
- Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов.
- Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект.
- Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.
- Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов.
С точки зрения языка программирования класс объектов можно рассматривать как тип данного, а отдельный объект - как данное этого типа. Определение программистом собственных классов объектов для конкретного набора задач должно позволить описывать отдельные задачи в терминах самого класса задач (при соответствующем выборе имен типов и имен объектов, их параметров и выполняемых действий).
Таким образом, объектно-ориентированный подход предполагает, что при разработке программы должны быть определены классы используемых в программе объектов и построены их описания, затем созданы экземпляры необходимых объектов и определено взаимодействие между ними.
Классы объектов часто удобно строить так, чтобы они образовывали иерархическую структуру. Например, класс “Студент”, описывающий абстрактного студента, может служить основой для построения классов “Студент 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. Реализовать класс для работы с линейным массивом, обеспечить:
- создание заполнением случайным образом или вводом с клавиатуры;
- сортировка выбором;
- вывод;
- поиск минимального и максимального элементов.
function changeProof(proofobj) { if (proofobj.style.display=='none') {proofobj.style.display='inline'} else {proofobj.style.display='none'} } Просмотреть листинг решения
// программа ==Пример 1== #include <iostream.h> #include <stdlib.h> #include <time.h> class Massiv { int *a, n; public: void Sozd(); void Del(); void Vvod(); void Vvod_Sl(); void Print(); int Min(int ind); // ind - с какого элемента начинать искать минимальный int Max(int ind); void Sort_Viborom(); }; void main() { Massiv a; randomize(); a.Vvod_Sl(); a.Print(); a.Sort_Viborom(); a.Print(); a.Del(); } void Massiv :: Sozd() { cout << "Количество элементов массива? "; cin >> n; a = (int *) malloc (sizeof(int) * n); } void Massiv :: Del() { free(a); } void Massiv :: Vvod() { Sozd(); for (int i=0; i < n; i++) { cout << i << "-й элемент? "; cin >> *(a+i); } } void Massiv :: Vvod_Sl() { Sozd(); for (int i=0; i < n; i++) { *(a+i)= -200+random(1001); } } void Massiv :: Print() { for (int i=0; i < n; i++) { cout << *(a+i) << " "; } cout << endl; } int Massiv :: Min(int ind) { for (int i=ind+1; i < n; i++) if (a[i]<a[ind]) ind = i; return ind; } int Massiv :: Max(int ind) { for (int i=ind+1; i < n; i++) if (a[i]>a[ind]) ind = i; return ind; } void Massiv :: Sort_Viborom() { for (int i=0; i < n-1; i++) { int m = Min(i); int Vsp=a[i]; a[i]=a[m]; a[m]=Vsp; } } |