русс | укр

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

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

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

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


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

Использование класса. Объекты


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


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

FIO director; // создали объект director типа FIO

FIO engineer;

После такого объявления создаются экземпляры класса (объекты) director и engineer, которые содержат собственные копии каждого поля класса. Т.е. поля first_name, middle_name и last_name у объектов director и engineer никак не связаны друг с другом.

Доступ к конкретным членам объекта осуществляется через операцию «точка». В общем виде это выглядит так:

объект.член_класса

Например:

cin >> director.first_name; // записали значение в поле first_name

director.print(); // вызвали метод print()

Пример простейшей программы, работающей с созданным объектами.

#include<iostream>

using namespace std;

 

class FIO

{

public:

char first_name[30];

char middle_name[30];

char last_name[50];

 

void print()

{

cout << last_name << ' ' << first_name << ' ' << middle_name;

};

};

 

void main()

{

setlocale(LC_ALL, "Russian");

FIO emp1, emp2;

cout << "Введите ФИО сотрудника: ";

cin >> emp1.last_name >> emp1.first_name >> emp1.middle_name;

cout << "\nВведите ФИО другого сотрудника: ";

cin >> emp2.last_name >> emp2.first_name >> emp2.middle_name;

int rc = strcmp(emp1.last_name, emp2.last_name);

if (!rc) // rc == 0, строки равны

cout << "\nВведены однофамильцы!";

else

if (rc < 0) // rc < 0, первая строка по алфавиту меньше второй

{

emp1.print();

cout << endl;

emp2.print();

}

else // rc > 0, первая строка по алфавиту больше второй



{

emp2.print();

cout << endl;

emp1.print();

}

cout << endl;

system("pause");

}

Обратите внимание, что в методе print обращение к полям производится напрямую, без указания имени объекта. Именно так происходит обращение к полям класса внутри его методов. Любой метод видит все поля класса, в том числе закрытые и может обращаться к ним напрямую по имени.

Поскольку класс является типом данных, то в одном классе можно объявлять поля, у которых типом является другой класс. Таким образом организуются сложные типы данных, которые отображают взаимосвязи сущностей в предметной области программы. Например:

class Employee

{

public:

FIO emp_fio; // Поле emp_fio является объектом класса FIO

Date emp_birth_date; // Дата рождения

char emp_dolzhnost[50]; // Должность

float emp_oklad; // Оклад

 

// Запись табельного номера

bool set_tab_num(unsigned int value)

{

if (value < 100 || value > 5000)

return false;

tab_num = value;

return true;

};

 

// Считывание табельного номера

unsigned int get_tab_num()

{

return tab_num;

};

 

// Вывод информации о сотруднике на экран

void display();

 

private:

unsigned int tab_num; // Табельный номер

};

 

void Employee::display()

{

emp_fio.print();

cout << "\nТабельный номер: " << get_tab_num();

cout << "\nДата рождения: ";

emp_birth_date.print();

cout << "\nДолжность: " << emp_dolzhnost;

cout << "\nОклад: " << emp_oklad;

 

};

В классе Employee поле emp_fio имеет тип FIO, т.е. является объектом класса FIO. Поле emp_birth_date также имеет тип, не являющийся встроенным. С большой вероятностью тип Date также является классом, а emp_birth_date – его экземпляром.

В классе объявлено закрытое поле tab_num – табельный номер. К нему нельзя получить доступ из программы в виде объект.tab_num. Доступ к нему имеют только методы класса. Это сделано потому, что в программе нужно контролировать значения, записываемые в это поле. Специально для доступа к данному полю объявлены 2 метода – set_tab_num (запись значения) и get_tab_num (чтение значения). При записи значения сначала проверяется его правильность. В приведённом примере значение табельного номера не может быть меньше 100 или больше 5000. Если записываемое значение корректно – оно заносится в поле tab_num, и метод возвращает true; в противном случае значение не записывается, и метод возвращает false.

Обратите внимание на объявление метода display в классе Employee. В самом классе его реализация отсутствует, там указан только прототип. Реализация метода находится вне класса, поэтому перед названием метода указано имя класса в виде Employee::. Операция :: называется операцией разрешения области видимости или операцией разрешения контекста. Она говорит компилятору, что метод display объявлен в классе Employee. Эта операция обязательна, если метод класса определяется вне его, в другой части программы (такая ситуация встречается довольно часто).

Один метод класса может вызывать другие методы того же класса, как это делается в методе display. Там вызывается метод get_tab_num для получения табельного номера (хотя можно было и непосредственно считать значение поля tab_num).

Пример использования класса Employee.

Employee gendir;

cout << "Введите ФИО ген. директора: ";

cin >> gendir.emp_fio.last_name >> gendir.emp_fio.first_name

>> gendir.emp_fio.middle_name;

strcpy(gendir.emp_dolzhnost, "Генеральный директор");

gendir.emp_oklad = 100000;

gendir.set_tab_num(100);

 

cout << "\nНаш генеральный директор:\n";

gendir.display();

cout << endl;

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



<== предыдущая лекция | следующая лекция ==>
Объявление класса | Конструкторы


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


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

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

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


 


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

 
 

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

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