
Классы в C++
Разделы класса
Public ( компонент может быть использован любой функцией) { открытый раздел}
Private ( компонент может быть использован только методами и друзьями класса)
Рrotected ( то же самое, что Private + компоненты доступны из производных классов).
Хорошим стилем считается описывать данные в закрытых разделах (private или protected), а методы в открытых(public).
Обычно описание класса помещают в заголовочный файл{*.h}, а реализацию методов класса помещают в файл{*.cpp}
Конструирование класса, моделирующего работу устройства
Устройство: принтер
Переменные, определяющие состояние устройства:
наличие электропитания (да,нет)
наличие бумаги (да, нет)
выполнение задания на печать (да, нет)
Методы:
включить/выключить
добавить бумагу
убрать бумагу
отправить задание на печать
остановить печать
просмотреть текущее состояние принтера
class Printer
{
private:
char model[15]; //модель принтера
int year; //год выпуска
int status; //состояние принтера
public:
void init_printer(char* _model, int _year);
void set_print();
void stop_print();
void show();
};
Замечание. Если раздел private включен в объявлении класса первым, ключевое слово private можно опустить:
class Printer
{char model[15]; //модель принтера
Int year; //год выпуска
int status; //состояние принтера
public:
void init_printer(char*_model,int_year);
void set_print();
void stop_print();
void show();};
Описание методов:
void Printer::init_printer(char* _model,int _year)
{strcpy(model,_model); //инициализация свойства model
year=_year; //инициализация свойства year
status=0; //начальное состояние – готов к печати}
void Printer :: set_print()
{if (!status) status=1;}
void Printer :: stop_print()
{status = 0;}
void Printer :: show()
{cout<<"Model:"<<model<<"year:"<<year<<"status:"<<status<<endl;}
В главную часть программы – функцию main() – включим следующие действия: создание объекта, инициализация свойств объекта, изменение состояния объекта и вывод его текущего состояния на экран:
int main(void)
{
Printer printer; //создание объекта
//инициализация свойств объекта
printer.init_printer("HP5P", 1999);
printer.show(); //вызов метода объекта
printer.set_print();
printer.show();
printer.set_print();
printer.show();
printer.stop_print();
printer.show();
return 0;}
В результате работы программы на экране появятся 4 строки текста:
Model: HP5P year: 1999 status: 0,
Model: HP5P year: 1999 status: 1,
Model: HP5P year: 1999 status: 1,
Model: HP5P year: 1999 status: 0.
Конструктор
Для создания объекта используется специальный метод, называемый конструктором. Узнать конструктор несложно – его имя совпадает с именем класса и для него не указывается тип возвращаемого значения.
Конструктор по умолчанию
Реализация
Person::Person ()
{}
или
Person::Person ()
{
Name = new char[7];
strcpy(Name,”Noname”);
Year = 0;}
Вызов конструктора по умолчанию
Person MyPerson;
Конструктор с параметрами
Реализация
Person::Person (char* N, int Y)
{Name = new char[strlen(N)+1];
strcpy (Name, N);
Year = Y;}
Вызов конструктора с параметрами
Person MyPerson(“Ann”,1990);
Конструктор с параметрами по умолчанию
Реализация конструктора
Person::Person (
char* N=“Noname”, int Y=0)
{Name = new char[strlen(N)+1];
strcpy (Name, N);
Year = Y;}
Вызов конструктора
Person MyPerson (“Ann”,1990); // или
Person MyPerson;
Конструктор со списком инициализации Реализация конструктора
Person::Person (
char* N, int Y): Name(new char[strlen(N)+1]),Year(Y)
{ //Если свойство Name - указатель
strcpy(Name,N);}
Вызов конструктора
Person MyPerson (“Ann”,1990);
Копирующий конструктор
Реализация
Person::Person (const Person& P)
{Name = new char[strlen(P.Name)+1];
strcpy (Name, P.Name);
Year = P.Year;}
Вызов копирующего конструктора
Person MyPerson(“Ann”,1990);
Person NewPerson(MyPerson);
В состав класса может быть включено несколько конструкторов, что обосновано таким свойством языка C++, как перегрузка функций. Конструкторы обязательно должны отличаться количеством или типами параметров, чтобы компилятор мог подобрать конструктор, соответствующий создаваемому объекту.
Класс может не содержать ни одного конструктора, в этом случае для создания объекта создается конструктор по умолчанию, который выделяет память под объект, но при этом не инициализирует переменные.
Вызывается конструктор в момент создания объекта класса.