
Программирование на C++
Понятие класса
Очень часто программы имеют дело с совокупностями разнотипных данных: имя, должность, табельный номер, год рождения и т.д. Каждая отдельная составляющая не описывает человека, смысл имеет только вся вместе взятая информация. Для хранения таких данных используется такое описание в C, как структура. Если мы интегрируем в полученную структуру также действия с этими данными (методы), то получим класс. Описание действий при определении такой единицы, как класс, не является обязательным.
Описание класса можно привести, например, в виде:
// Класс dataset
class NameDataSet
{
public:
char firstName[128];
char lastName [128];
int creditCard;
};
// экземпляр класса dataset
NameDataSet nds;
Объявление класса начинается с ключевого слова class, после которого идет имя класса и пара фигурных скобок, открывающих и закрывающих тело класса.
После ключевого слова public идет описание полей класса. Как видно из листинга, класс NaneDaraSet содержит поля имени, фамилии и номера кредитной карты. Первые два поля являются символьными массивами, а третье имеет тип int (будем считать, что это и есть номер кредитной карты).
Вообще, в классе могут быть описаны любые объекты, включая другие классы.
Обратиться к членам класса можно так:
NameDataSet nds;
nds.creditCard = 10;
cin >> nds.firstName;
cin >> nds.lastNairve;
Здесь nds — экземпляр класса NameDataSet (или отдельный объект типа NameDataSet); целочисленная переменная nds.creditCard— свойство объекта nds; член nds.crecitCard имеет тип int, тогда как другой член этого объекта, nds.firstName, имеет тип char. Видно, что обращение к элементам класса производится так же, как и обращение к элементам структуры или объединения.
Приведенный пример можно объяснить так: в этом фрагменте программы происходит объявление объекта nds, который затем будет использован для описания покупателя. Программа присваивает этому человеку кредитный номер 10. Затем программа считывает имя и фамилию со стандартного устройства ввода.
В этом примере используется потоковая операция >>, где в качестве источника данных используется стандартное устройство ввода cin (обычно это клавиатура). Возможна также потоковая операция вывода <<, где в качестве получателя можно использовать стандартное устройство вывода cout (обычно это экран дисплея).
Формы описания полей класса
В нашем примере при описании полей класса мы использовали ключевое слово public. Существуют следующие формы описания полей класса, определяющие также права доступа к нему:
public – член класса, доступный извне этого класса, а также и для других членов того же класса.
private – член класса, доступный только для других членов того же класса (используется по умолчанию).
protected – член класса, доступный только для членов этого класса и его подклассов. Защищенные члены класса не являются общедоступными.
friend – функция или класс, которые не являются членом данного класса, однако имеют доступ к защищенным членам класса.
Основные свойства классов и их элементов
1. Инкапсуляция – это объединение данных и обрабатывающих их функций (методов) в одном классе как типе объектов. Методы могут быть определены внутри класса. Такая форма описания делает метод встроенным по умолчанию. Второй метод описания заключается в том, что внутри класса описывается прототип, а описание метода размещается вне тела класса. Пример класса суммы чисел:
class Sum
{
int x,y,s;
public:
void getx(int x1) { x=x1; } // описание метода
void gety(int y1) { y=y1; } // описание метода
void summa(); // прототип метода
};
// описание метода
void Sum::summa()
{
s=x+y;
cout<<”\nСумма “<<x<<” и ”<<y<<” равна: ”<<s;
}
Под переменные x, y, s при описании каждого объекта класса Sum отводится динамическая память. То есть, эти компоненты в каждом из объектов будут располагаться в разных ячейках памяти. Можно описать также статические объекты, которые будут доступны во всех объектах данного класса. В этом случае память под данный объект не выделяется, и память под такие объекты надо выделять вручную. Например, пусть в классе Student мы описали объект
static int noOfStudents;
Мы должны сами выделить для нее место, например, с помощью оператора
int Student::noOfStudents=0;
Статическими могут быть объявлены и функции. Понятно, что они не могут прямо обращаться к компонентам этого класса, так как эти компоненты принадлежат конкретным объектам данного класса.
2. Наследование – это способность классов C++ перенимать свойства уже существующих классов. То есть, если при определении класса он включает в себя другой класс, то мы получаем доступ к объектам и этого класса.
3. Полиморфизм – это способность решать, какая из перегруженных функций-членов должна быть вызвана в зависимости от текущего типа времени исполнения объекта.