«

»

C++. ООП. Общие сведения о классах

В этом уроке Вы познакомитесь с классами в C++. Класс является обобщением понятия структуры, в этом типе данных объединены данные (поля) и функции (методы обработки данных). Концепция классов лежит в основе объектно-ориентированного программирования (ООП). Знание классов необходимо для составления программ, работающих под управлением MS Windows.

Классом называется составной тип данных, элементами которого являются функции и переменные (поля). В основу понятия класс положен тот факт, что «над объектами можно совершать различные операции». Свойства объектов описываются с помощью полей классов, а действия над объектами описываются с помощью функций, которые называются методами класса. Класс имеет имя, состоит из полей, называемых членами класса, и функций — методов класса.

После описание класса необходимо описать переменную типа class. Это описание имеет следующий формат:

 

1
2
3
4
5
6
7
8
9
class name
{
private:
//описание закрытых членов и методов класса
protected:
//описание защищенных членов и методов класса
public:
//описание открытых членов и методов класса
}

 

В отличие от полей структуры, доступных всегда, в классах могут быть члены и методы различного уровня доступа:

  • открытые, также называемые публичными, (public). Их вызов осуществляется с помощью оператора . («точка»);
  • закрытые, или приватные, (private), доступ к которым возможен только с помощью открытых методов;
  • защищенные (protected) методы, являются промежуточными между private и public. Их мы рассмотрим в уроке про наследование.

Класс — это фактически новый тип данных. Для создания переменной типа класс служит оператор:

name_class name;

Здесь name_class — имя класса, name — имя переменной. В дальнейшим переменную типа class будем называть объект или экземпляр класса. Объявление переменной типа class (в нашем примере переменная name типа name_class) называется созданием объекта. 

После описания переменной можно обращаться к членам и методам класса. Это делается аналогично обращению к полям структуры с помощью оператора . (точка).

 

1
2
3
4
5
//обращение к полю p1 экземпляра класса name
name.p1;
//обращение к методу f1 экземпляра класса name
//par1, par2,.. , parn - список формальных параметров функции f1
name.f1(par1, par2,..,parn);

 

Обратите внимание, что члены класса доступны из любого метода класса и их не нужно передавать в качестве параметров функций-методов.

В качестве примера, рассмотрим класс complex для работы с комплексными числами. В классе complex будут члены класса:

  • double x — действительная часть комплексного числа;
  • double y — мнимая часть комплексного числа.

Также в нем будут методы:

  • double modul() — функция вычисления модуля комплексного числа;
  • double argument() — функция вычисления аргумента комплексного числа;
  • void show_complex() — функция  выводит комплексное число на экран.

Ниже приведен текст класса и функция main, демонстрирующая работу с классом.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
//определяем класс complex
class complex
{
public:
double x; //действительная часть комплексного числа
double y; //мнимая часть комплексного числа
//метод класса complex - функция modul - для
//вычисления модуля комплексного числа
double modul()
{ return pow(x*x+y*y,0.5); }
//метод класса complex - функция argument для
//вычисления аргумента комплексного числа
double argument()
{ return atan2(y,x)*180/PI; }
//метод класса complex - функция show_copmlex для
//вывода комплексного числа
void show_complex()
{
if (y>=0) //вывод комплексного числа с положительной мнимой частью
cout<<x<<y<<"+"<<y<<"i"<<endl;
else //вывод комплексного числа с отрицательной мнимой частью
cout<<x<<y<<"i"<<endl;
}
};
//главная функция
int main()
{
setlocale(LC_ALL,"Rus");
//определяем переменную chislo типа complex
complex chislo;
//определяем действительную часть комплексного числа
chislo.x=2.5;
//определяем мнимую часть комплексного числа
chislo.y=-1.432;
//вывод комплексного числа, chislo.show_complex() -
//обращение к методу класса
chislo.show_complex();
//вывод модуля комплексного числа, chislo.modul() -
//обращение к методу класса
cout<<"Модуль числа = "<<chislo.modul();
//вывод аргумента комплексного числа, chislo.argument() -
//обращение к методу класса
cout<<endl<<"Аргумент числа = "<<chislo.argument()<<endl;
system("pause");
return 0;
}

 

Результат работы программы:

 

Возникает вопрос, зачем же нужны открытые и закрытые члены и методы класса и какие члены и методы должны быть объявлены открытыми, а какие закрытыми? Использование открытых членов и методов позволяет получить доступ к элементам класса, однако это не всегда хорошо. Если все члены класса объявить открытыми, то при непосредственном обращении к ним появится потенциальная возможность внести ошибку в функционирование взаимосвязанных между собой методов класса.

Представьте себе класс «Система линейных алгебраических уравнений» (SLAU), членами которого являются:

  • матрица коэффициентов А;
  • массив b;
  • решение системы — массив x;
  • размерность системы n.

Непосредственное обращение к n, например cin>>SLAU.n; или SLAU.n=-5; нарушит функционирование всех методов класса. Представьте себе , что произойдет с методом решения системы линейных алгебраических уравнений при отрицательном количестве уравнений.

Поэтому общим принципом является следующие: «Чем меньше открытых данных о классе используется в программе, тем лучше». Уменьшение количества публичных членов и методов позволит минимизировать количество ошибок. Желательно, чтобы все члены класса были закрытыми, тогда невозможно будет обращаться к членам класса непосредственно с помощью оператора «.». Количество открытых методов также следует минимизировать.

Если в описании элементов класса отсутствует указание метода доступа, то члены и методы считаются закрытыми (private). Принято описывать методы за пределами класса.

Попробуем немного изменить рассмотренный ранее пример класса complex. Добавим метод vvod, предназначенный для ввода действительной и мнимой части числа; члены класса и метод show_complex сделаем закрытыми, а остальные методы открытыми. Ниже приведен текст работы с классом complex после внесения изменений. Обратите внимание на синтаксис методов класса, когда они описываются за его пределами.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include <iostream>
#include <math.h>
#define PI 3.14159
using namespace std;
class complex //определяем класс complex
{
//открытые методы
public:
void vvod();
double modul();
double argument();
//закрытые члены и методы
private:
double x;
double y;
void show_complex();
};
//описание открытого метода vvod класса complex
void complex::vvod()
{
cout<<"введите x \t"; cin>>x;
cout<<"введите y \t"; cin>>y;
//вызов закрытого метода show_complex из открытого метода vvod
show_complex();
}
//описание открытого метода modul класса complex
double complex::modul()
{ return pow(x*x+y*y,0.5); }
//описание открытого метода argument класса complex
double complex::argument()
{ return atan2(y,x)*180/PI; }
//описание закрытого метода modul класса complex
void complex::show_complex()
{
if (y>=0) cout<<x<<y<<"+"<<y<<"i"<<endl;
else cout<<x<<y<<"i"<<endl;
}
int main()
{
setlocale(LC_ALL,"Rus");
complex chislo;
chislo.vvod();
cout<<"Модуль комплексного числа = "<<chislo.modul();
cout<<endl<<"Аргумент комплексного числа = "<<chislo.argument()<<endl;
system("pause");
return 0;
}

 

Результат работы программы:

 

В рассмотренном примере показано совместное использование открытых и закрытых элементов класса. Разделение на открытые и закрытые в этом примере несколько искусственное, оно проведено только для иллюстрации механизма совместного использования закрытых или открытых элементов класса. Если попробовать обратиться к методу show_complex() или к членам класса x, y из функции main, то компилятор выдаст сообщение об ошибки (доступ к элементам класса запрещен).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *