Параллельное программирование: Учебное пособие, страница 54

Пример определения класса в С++ представлен текстом 3.1.

Текст 3.1. – Определение класса с именем  Datum

classDatum

{

public:            // Объявляются три общих члена класса:

intget_x();     // целая функция-член класса Datum 

Datum();         // и два конструктора функций с одинаковыми Datum(int);             // именами, но различными аргументами.

private:

intx;           // Объявление частной переменной класса

};

intDatum::get_x()    // Определение функции get_x() – члена

{ returnx; }                     // класса Datum , которая передает значение x.

Datum::Datum() {x = 0}                                      // Определения двух

Datum::Datum(intarg_x) {x = arg_x}    // конструкторов класса

voidtest()   // Использование объявленных и определенных объектов:

{

Datuma_datum;                  // Объявление новых видов

Datumanother_datum(23);        // данных и распределение

Datum *DatumPtr = newDatum(23);// целочисленного массива.

int val = a_datum.get_x();      // Получение х из первого и

int val1 = DatumPtr->get_x();   // третьего наборов данных.

delete DatumPtr;               //Удаление образца массива

}

Приведенный текст поясняет различные особенности механизма класса С++. Этот фрагмент программы определяет класс с именем Datum, содержащий данное с именем х, которое является членом класса, функцию Datum::get_x, которая является членом этого класса, и два конструктора функций (Datum::Datum).

Функция test иллюстрирует использование класса. В пределах определения Datum::get_x можно прямо обратиться к компоненту данных x, так как x и get_x представлены конкретным текстом в определении класса. Для функции get_x можно также включать ее определение непосредственно в определении класса, следующим образом:

public:

int get_x() { return x; };

...

Функции-члены, имеющие имя Datum, являются конструкторами функций для класса Datum. Конструктор класса вызывается всегда, когда создается новый объект класса. Конструкторы функций используются для инициализации (присвоения переменным значений перед вычислением) и могут перезагружаться. Перед именами вновь создаваемых объектов класса соответствующего типа всегда приписывается имя базового класса.

Функция test в тексте 3.1 создает и использует три объекта Datum, два из которых объявлены на первых двух строках тела функции test. В отличие от С++ для использования имени класса Datum в C мы должны были бы записать struct Datum. В третьей строке используется оператор new, чтобы распределить третий объект Datum.

Конструктор без аргументов, именуемый конструктором по умолчанию, вызывается при создании объекта с именем a_datum. В нем уже задано значение для x, равное нулю. Объявленные операторы another_datum и new определены с целочисленным параметром и, согласно второму конструктору, инициализируют переменную x = 23.

Для обращения к полям структуры в языке С используют составной идентификатор с точкой (struct.fieldname), а в С++ используют указатель-стрелку (structptr->fieldname). Такие же лексические конструкции могут использоваться и при обращении к функциям-членам класса в C++, как показано в функции test.

В классах C++ предусмотрен также механизм поддержки сохранности введенного класса. Так, члены класса C++ могут быть обозначены как общими (public), так и частными (private). Общий элемент класса может использоваться без ограничения в любой программе, в которой имеется ссылка на переменную-образец класса. При этом общие функции-члены класса могут вызываться, а компоненты общих данных можно читать или записывать. К частным же членам класса можно обращаться только из объекта, принадлежащего классу. К частным компонентам данных можно обращаться только посредством функции класса с соответствующими компонентами и, наконец, частные функции-члены могут быть вызваны только другой функцией-членом класса. Например, переменная x в классе Datum является частной переменной и, следовательно, к ней можно обращаться функцией-членом get_x, но нельзя непосредственно упомянуть эту переменную как a_datum.x.