русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Разделы класса


Дата добавления: 2015-07-09; просмотров: 894; Нарушение авторских прав


Public ( компонент может быть использован любой функцией) { открытый раздел}

Private ( компонент может быть использован только методами и друзьями класса)

Рrotected ( то же самое, что Private + компоненты доступны из производных классов).

 

Хорошим стилем считается описывать данные в закрытых разделах (private или protected), а методы в открытых(public).

Обычно описание класса помещают в заголовочный файл{*.h}, а реализацию методов класса помещают в файл{*.cpp}

 

 

void Student:; SetFam(char*NFam)

{ Strcpy(Fam, Nfam)

}

 

Это проще, но лучше делать с контролем памяти.

 

void Student:; SetFam(char*NFam)

{

if (Strlen(NFam)>strlen(Fam))

{

delete Fam;

Fam=new char[Strlen(NFam)+1];

}

strcpy(Fam,NFam);

}

Аналогичным образом реализуется метод SetName( так же, вместо Fam->Name)

 

Метод SetAge реализуется проще:

void Student:: SetAge(int Nage)

{ Age=NAge;

}

 

Реализация методов получения информации

 

int Student:: GetAge( )

{ return Age; }

char* Student:: GetFam( char*NFam)

{

strcpy(NFam; Fam);

return Nfam;

}

 

Если бы мы реализовали метод GetFam следующим образом

char * Student:: GetFam( )

{

return Fam;

}

то мы бы вернули адрес закрытого поля класса. Таким образом программа пользователя, получив доступ к закрытой части класса, могла бы модифицировать это поле, минуя методы класса, что противоречит основам ООП. В нашем случае передается в метод строка Nfam, куда и будет скопировано значение поля Fam. Метод GetFam вернет адрес этой строки.

 

Конструкторы и деструкторы.

 

Конструктор - это метод, который вызывается в момент создания объекта; имя конструктора всегда совпадает с именем класса. Класс может иметь несколько конструкторов, при этом они отличаются числом или типом параметров.



Конструктор не имеет типа. Класс может не иметь конструктор, при этом считается, что компилятор сам создает конструктор. Конструктор без параметров называется конструктором по умолчанию. В основном конструкторы используются для инициализации полей класса. Особенно часто это нужно, если класс имеет динамичные поля.

 

 

Рассмотрим класс Employee, описанный в строках 4-26.

4. class Employee //********** Класс "служащий"

5. {

6. public:

7. Employee( char *NName, char *NFam, char *NDep, int NAge);

8. virtual void print();

9. void SetName( char *NName);

10. int GetAge();

11. char *GetDep( char *NDep);

12. char *GetFam( char *NFam);

13. char *GetName( char *NName);

14. void SetAge( int NAge);

15. void SetDep( char *NDep);

16. void SetFam( char *NFam);

17. Employee();

18. virtual ~Employee();

19. friend istream& operator >>(istream&,Employee&);

20. friend ostream& operator <<(ostream&,Employee&);

 

21. protected:

22. int Age;

23. char *Dep;

24. char *Name;

25. char *Fam;

26. };

 

 

Этот класс описан в заголовочном файле Emploee.h. Он имеет 3 динамичных поля: Dep, Name, Fam(23-25). Класс имеет конструктор по умолчанию(стр. 17), конструктор с параметрами(стр. 7).

 

Реализация конструктора приведена в строках 75-84, которые находятся в файле Emploee.cpp.

 

75. Employee::Employee()

76. {

77. Name=new char[strlen("no name")+1];

78. strcpy(Name,"no name");

79. Fam=new char[strlen("no fam")+1];

80. strcpy(Fam,"no fam");

81. Dep=new char[strlen("no dep")+1];

82. strcpy(Dep,"no dep");

83. Age=0;

84. }

 

Реализация конструктора:

· выделяет память;

· копирует в нее строки no fam, no name...

 

В строках 135-144 приведена реализация конструктора с параметрами.

 

135. Employee::Employee(char *NName, char *NFam, char *NDep, int NAge)

136. {

137. Name=new char[strlen(NName)+1];

138. strcpy(Name,NName);

139. Fam=new char[strlen(NFam)+1];

140. strcpy(Fam,NFam);

141. Dep=new char[strlen(NDep)+1];

142. strcpy(Dep,NDep);

143. Age=NAge;

144. }

 

Вызывается конструктор в момент создания объекта класса. В строке 288 создается объект х-типа Employee путем вызова конструктора умолчания.

 

288. Employee x;

289. Employee y("AA","BB","CC",100);

 

В строке 289 создается объект у путем вызова конструктора с параметрами.

 

 

В строке 290 создается и инициализируется массив z типа Employee.

 

290. Employee z[]={Employee("AA1","BB1","CC1",1001),Employee("AA2","BB2","CC2",1002),Employee("AA3","BB3","CC3",1003)};

 

Деструктор - это метод, который вызывается при уничтожении объекта. Имя деструктора всегда совпадает с именем класса; начинается со значка~

Класс Employee имеет деструктор ( строка 18).

 

18. virtual ~Employee();

 

Реализация деструктора приведена в строках 85-90.

 

85. Employee::~Employee()

86. {

87. delete Name;

88. delete Fam;

89. delete Dep;

90. }

 

Как видно из этих строк, он освобождает выделенную ранее динамичную память. Деструктор, как и конструктор, нельзя вызвать напрямую. Деструктор не имеет типа и не принимает параметров.

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

 

 

Объекты в динамичной памяти.

 

Пример.

Student *St;

St=new Student;

St-указатель на объект типа Student. При выполнении оператора nem создается объект типа Student путем вызова конструктора умолчания, его адрес присвоится указателю St. Если имеется указатель на объект, то для вызова его методов вместо точки используется->

Например:

 

St-> SetAge(100);

delete St;

 

Для удаления объектов из динамической памяти используется оператор delete.

 

Пример наследования.

 

В строках 4-26 описан класс Employu, характеризующий сотрудника какой-либо компании. Породим от этого класса 2 класса Teacher и Driver, характеризующих водителя и учителя.

Класс Employee имеет методы

Set... для установки полей класса;

Get... для получения значений полей класса;

имеет 2 конструктора, деструктор; метод print(стр8) для распечатки значений полей. Его методы во многом аналогичны методам класса Student.

 

Класс Driver описан в файле Driver.h (стр. 32-46), класс Driver является производным от класса Employee (стр32).

 

 

32. class Driver : public Employee

33. {

34. public:

 

35. Driver(char *NName, char *NFam, char *NDep, int NAge, char *NCarNum, int NLen);

36. void print();

37. char * GetCarNum( char *NCarNum);

38. int GetLen();

39. void SetCarNum( char *NCarNum);

40. void SetLen( int NLen);

41. Driver();

42. virtual ~Driver();

 

43. protected:

44. int Len;

45. char * CarNum;

46. };

 

 

В языке С разрешено множественное наследование, то есть класс может быть производным от нескольких классов.

Класс Driver унаследовал от Employee все его поля и методы. Помимо этого, класс Driver имеет 2 собственных поля- характеризующие водителя ( номер машины, водительский стаж) (стр. 44,45).

Класс Driver имеет методы Set и Get для управления этими полями (стр. 38-40). Как и класс Employee, класс Driver имеет 2 конструктора и деструктор + метод print для распечатки полей.

 

Методы класса Driver во многом похожи на методы класса Employee. Особое внимание следует уделить конструктору с параметрами. При создании объекта производного класса сначала выполняются конструкторы базовых классов в порядке их перечисления, затем конструктор производного класса.

 

 

В строках 221-226 реализован конструктор с параметрами типа класса Driver. Такой конструктор (стр221) называется конструктором со списком инициализации.

 

221. Driver::Driver(char *NName, char *NFam, char *NDep, int NAge, char *NCarNum, int NLen): Employee( NName, NFam, NDep, NAge)

222. {

223. CarNum=new char[strlen(NCarNum)+1];

224. strcpy(CarNum,NCarNum);

225. Len=NLen;

226. }

 

 



<== предыдущая лекция | следующая лекция ==>
Наследование | Множественное наследование


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.262 сек.