В этом уроке Вы познакомитесь с классами в 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, то компилятор выдаст сообщение об ошибки (доступ к элементам класса запрещен).