Чтобы использовать класс в программе нужно объявить его экземпляр – объект этого класса. Делается это аналогично объявлению переменной, при этом название класса используется в качестве типа данных.
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()
Пример простейшей программы, работающей с созданным объектами.
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).