Использование класса DataClass

Включите в файл classes.cpp функцию main():
#include <iostream.h>
class DataClass
{
private:
int PrivateDataMember;
public:
DataClass(int Value);
int PublicDataMember;
int PublicMethod(void);
};
DataClass::DataClass(int Value)
{
PrivateDataMember = Value;
}
int DataClass::PublicMethod(void)
{
return PrivateDataMember;
}
void main()
{
}

Функция main() содержит код, выполняемый при запуске программы. Мы начнем ее с объявления объекта класса DataClass. Одновременно с этим мы передадим значение конструктору класса (оно будет присвоено переменной PrivateDataMember). Пусть это будет значение 1; тогда объект DataObject, принадлежащий классу DataClass, будет создаваться следующим образом:
void main()
{
DataClass DataObject(1);
.
.
.
}

Теперь у нас есть объект с именем DataObject. Он содержит данные, которые мы в него занесли, а также поддерживает метод PublicMethod().

Чтобы присвоить значение открытой переменной класса, PublicDataMember, можно воспользоваться оператором "точка" (.) языка C++. В следующем фрагменте этой переменной присваивается значение 2:
void main()
{
DataClass DataObject(1);
DataObject.PublicDataMember = 2;
.
.
.
}

Обычно все обращения к членам объекта (переменным и функциям) происходят именно так.

Например, мы можем вывести значение переменной PublicDataMember, посылая его в поток
cout:
void main()
{
DataClass DataObject(1);
DataObject.PublicDataMember = 2;
cout << "DataObject.PublicDataMember = "
<< DataObject.PublicDataMember << "\n";
.
.
.
}

Но как получить значение, присвоенное PrivateDataMember? Поскольку код в функции main() не принадлежит объекту DataObject, из него нельзя напрямую обратиться к закрытой переменной этого объекта. Чтобы добраться до нее, надо вызвать метод PublicMethod() и вывести полученное значение:
void main()
{
DataClass DataObject(1);
DataObject.PublicDataMember = 2;
cout << "DataObject.PublicDataMember = "
<< DataObject.PublicDataMember << "\n";
cout << "DataObject.PrivateDataMember = "
<< DataObject.PublicMethod() << "\n";
}

Программа работы с классами готова - запустите ее. Результаты ее работы изображены на рис. 1.7. Как видно из рисунка, нам удалось вывести значения и открытой, и закрытой переменных объекта DataClass. Первое знакомство с классами и объектами C++ состоялось.

 
Рис. 1.7. Запуск программы classes

Ниже приведен полный текст программы из файла classes.cpp.
classes.cpp
#include <iostream.h>
class DataClass
{
private:
int PrivateDataMember;
public:
DataClass(int Value);
int PublicDataMember;
int PublicMethod(void);
};
DataClass::DataClass(int Value)
{
PrivateDataMember = Value;
}
int DataClass::PublicMethod(void)
{
return PrivateDataMember;
}
void main()
{
DataClass DataObject(1);
DataObject.PublicDataMember = 2;
cout << " DataObject.PublicDataMember = "
<< DataObject.PublicDataMember << "\n";
cout <<" DataObject.PrivateDataMember = "
<< DataObject.PublicMethod() << "\n";
}

Наш первый пример был крайне примитивным - он всего лишь показал, как создать класс и объект в программе на C++. Он совершенно не раскрывает основной смысл объектов - хранение данных и внутреннюю работу с ними. Сейчас мы рассмотрим более реальный пример, который покажет, как работают объекты и для чего они нужны.

Реальный пример на C++

Давайте рассмотрим более жизненный пример на C++, который бы продемонстрировал возможности объектов по внутренней обработке данных.

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

Создайте проект schoolroom и добавьте в него новый файл schoolroom.cpp. Мы создадим класс с именем SchoolClass для хранения и обработки оценок:
#include <iostream.h>
class SchoolClass {
};

Сведения об оценках будут храниться в области памяти с именем ClassData. Переменная ClassData, которую мы сейчас создадим, представляет собой указатель на начало данных, хранящихся в памяти. Для выделения области памяти необходимого размера нужно знать, сколько студентов участвовало в контрольной (это количество будет передаваться конструктору в качестве параметра).

 

Указатель - это переменная, в которой хранится адрес области памяти. В языках C и C++ имя массива представляет собой указатель на начало данных массива в памяти. Чтобы объявить указатель в C и C++, следует снабдить имя переменной префиксом * ("звездочка").

 

Мы также создадим в области данных целую индексную переменную ClassDataIndex, определяющую наше положение относительно начала массива при добавлении сведений о новом ученике:
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
};

Область памяти для хранения оценок разумнее всего выделять в конструкторе класса. Мы передадим ему количество студентов, по которому можно будет определить размеры выделяемой области. Также обратите внимание, как мы инициализируем в конструкторе индексную переменную ClassDataIndex значением 0:
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
.
.
.
};
SchoolClass::SchoolClass(int NumberStudents);
{
ClassData = new int[NumberStudents];
ClassDataIndex = 0;
}

Память для хранения данных выделяется с помощью оператора C++ new. В данном случае выделяется область, размера которой достаточно для хранения NumberStudents целых чисел. Оператор new является встроенным оператором C++ и используется вместо таких функций C, как malloc() и calloc(). Мы неоднократно встретимся с ним в этой книге.

При желании можно рассматривать выделенную область памяти как массив (в C и C++ имена массивов и указатели считаются практически синонимами). Тогда для обращения к первому целому в выделенной области можно использовать запись ClassData[0], к следующему - ClassData[1] и т. д.

Итак, мы выделили область памяти, которая будет интерпретироваться как массив, и размера которой хватает для хранения NumberStudents целых значений оценок.

Но как избавиться от выделенной области, когда необходимость в ней отпадет? Помимо конструкторов в C++ существуют деструкторы - они вызываются при уничтожении объекта и содержат код "сборки мусора". В нашем примере деструктор будет уничтожать выделенную ранее область памяти.

Деструкторы C++

Деструктор отчасти похож на конструктор, только он автоматически вызывается при уничтожении объекта. Между ними существует даже внешнее сходство, но имя деструктора снабжается префиксом ~ ("тильда"):
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
.
.
.
};
SchoolClass::SchoolClass(int NumberStudents);
{
ClassData = new int[NumberStudents];
ClassDataIndex = 0;
}
SchoolClass::~SchoolClass(void)
{
}

Деструктор должен вернуть системе область памяти, выделенную при выполнении конструктора. Для оператора new существует противоположный по смыслу оператор delete, при помощи которого можно уничтожить массив:
SchoolClass::~SchoolClass(void)
{
delete ClassData;
}

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

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




































































































































Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: