Лекция: Первое знакомство с ООП

 

Пример 1. Разработаем простейший класс для работы с двумя целыми числами. В класс включим конструктор и следующие функции: вывод двух целых чисел; вычисление их суммы; проверка, делится ли одно число на другое без остатка; изменение двух целых чисел по правилу: наименьшее число или оба, если они одинаковы, умножаем на величину par, которая передаётся как параметр функции при её вызове.

class FirstCl { // начало описания классаFirstCl

int a,b; /* поля класса, т. е. переменные */

public: /* атрибут доступа(см.§ 2) */

/* Заголовок конструктора. Это функция, которая имеет то же имя, что и класс; тип возвращаемого значения не записывается.*/

FirstCl(int x, int y);

/* Заголовки четырёх функций (методов) класса, оформленных как внешние. Они похожи на прототипы обычных самостоятельных функций, только поля класса, т. е. два целых числа, в качестве параметров не записываем */

void MyPrint(); /* Вывод целых чисел*/

int MySum(); /* Их обычное суммирование*/

/* Логическая функция, возвращающая true или false в зависимости от того, делится ли a на b без остатка (для 10 и 3 — false, 3 и 10 — false, 10 и 2 — true, 2 и 10 — false). */ bool MyTest();

void Change (int ); /* Метод, который изменяет поля класса. */

}; /* The end of class */

/* Текст внешнего конструктора. Перед именем внешнего конструктора и каждой внешней функции записываем имя класса и операцию “::” (разрешение области видимости). Она показывает, какому классу принадлежит конструктор и методы. */

FirstCl::FirstCl (int x, int y) { a=x; b=y; };

/* Тексты четырёх внешних методов. */

void FirstCl::MyPrint()

{ cout<<"\nThe first number "<<a<<" The second number "<<b <<endl;} ;

int FirstCl::MySum() { return a+b; };

bool FirstCl::MyTest()

{ return !(a%b); } // или return !((a%b)? true: false);

void FirstCl::Change (int par)

{ if (a>b) b*=par; else if (a<b) a*=par; else { b*=par; a*=par; }

};

/* В головной функции создаём объект, т. е. переменную типа класс, и вызываем включённые в класс методы. */

int main()

{ FirstCl obj(10,2); // 1

obj.MyPrint(); // 2

cout<<"\nSum "<<obj.MySum();

if (obj.MyTest() ) cout<<"\nYes"; // 3

else cout<<"\nNo";

obj.Change(10); // 4

cout<<"\nChanging ";

obj.MyPrint(); // 5

getch(); return 0; }

В строке //1 объявили объект obj и одновременно с этим вызвали конструктор, с помощью которого создаётся объект, и в класс передаются числа 10 и 2. Методы (функции) этого объекта будут выполняться для этих чисел. При объявлении объекта можно в качестве “фактических параметров” для конструктора передать не только константы, а и значения переменных:

int A,B; cin>>A>>B; FirstCl obj(A,B);

При вызове функций (строки // 2 — // 5) записываем имя объекта (obj), но не класса, и после операции “точка” имя метода (функции). Поля класса передаются в объект с помощью конструктора. При вызове каждого метода повторно передавать эти числа, как для обычных функций, не надо.

Метод может использовать дополнительные параметры, которые не являются полями класса. Передаём только те параметры, которые не включены в класс. У нас для функции Change таким параметром является число, на которое умножаем наименьшее из двух чисел, или оба, если они одинаковы. Тогда в скобках при вызове такого метода записываем фактические параметры. Для функции Change передаём константу 10 для параметра par.

При вызове методов класса есть аналогия с обычными самостоятельными функциями, не членами класса. Методы типа void вызываются с помощью объекта отдельно (//2, //4, //5). Вызов метода, отличного от void, записывается непосредственно в выражении, а значит, в операторе, в котором используется значение функции (см. //3).

Пример 2. Разработать класс для работы с одномерным массивом наибольшей размерности 20.

В отличие от первого примера, все функции оформим как встроенные.

#define Midsize 20

/*Определили макрос для наибольшей размерности массива */

class Clara

{ int n; /* реальная размерность массива */

float A[Midsize];

public:

/* Конструктор инициализирует одно поле — размерность массива. При этом осуществляется проверка передаваемого значения. Массив, который является вторым полем класса, определяется с помощью функции Main. */

Clara (int m) { n=m; if (n>Midsize || n<1) n=10; } ;

// Метод для ввода массива.

void MyInp()

{ int x=1, y=whereby()+1;

for(int I=0; I<n; I++, x+=11)

{ if (x>80-10) { x=1; y++;}

/* Если числа не помещаются в строке, переходим в начало следующей. */

gotoxy(x,y); cin>>A[i]; }

} ; // После скобки “;” не обязательна.

/* Метод для “цветного” вывода массива: числа num выводятся цветом С1, а остальные — цветом С2. */

void MyOut(int C1, int C2, float num)

{ cout<<endl;

for ( int i=0; i<n; i++)

{ if (A[i]==num) textcolor ( C1 );

else textcolor ( C2 );

cprintf ( "%10.4f", A[i] ); }

}

/* Логический (булевский) метод, возвращающий true или false в зависимости от того, найдено число t в массиве или нет */

bool Test (float t)

{ for (int i=0; i<n; i++) if (A[i]==t) return true;

return false; }

/* Функция (метод), которая в массиве каждое наибольшее число меняет на наименьшее число и наоборот. Кроме того, функция возвращает наибольшее и наименьшее значения. */

void MyChange ( float &mx, float &mn) { mx=mn=A[0];

for(int i=0; i<n; i++)

{ mx= A[i]>mx? A[i]: mx;

mn= A[i]<mn? A[i]: mn; }

for(int i=0; i<n; i++)

if (A[i]==mx) A[i]=mn;

else if (A[i]==mn) A[i]=mx;

} // Конец последнего метода MyChange

}; // Конец описания класса. “;”(точка с запятой) обязательна.

/* В головной функции работаем с несколькими одномерными массивами, пока не введём в качестве размерности число 0. */

int main()

{ int N=5; float num;

do { ClArray ObArr(N); ObArr.MyInp(); // Ввод массива

while(1) /* Цикл для поиска нескольких чисел в массиве */

{ cout<<"\n Number for find (1000 — exit)"; cin>>num;

if (num==1000) break;

ObArr.MyOut ( 10,13, num);

// Вывели массив разным цветом

if ( ObArr.Test ( num ) ) cout <<" \n There is " ;

else cout<<"\n There is not ";

cout<<num; }

float MyMx, MyMn;

/* Изменяем массив и возвращаем в функцию main наибольшее (MyMx) и наименьшее (MyMn) значения. */

ObArr.MyChange(MyMx, MyMn);

/* Вывод массива разным цветом (наибольшее значение(MyMx) и остальные). */

ObArr.MyOut(9,13,MyMx);

/* Вывод массива разным цветом (наименьшее значение(MyMn) и остальные) */

ObArr.MyOut(14, 13, MyMn);

cout<< "\n Size of array (0 — exit)"; cin>>N;

} while ( N);

return 0; }

еще рефераты
Еще работы по информатике