Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ява.doc
Скачиваний:
4
Добавлен:
14.04.2019
Размер:
264.7 Кб
Скачать

15. Формальное определение класса

Класс - это механизм для создания объектов.

Класс объявляется с помощью ключевого слова class. Синтаксис объявления класса похож на синтаксис объявления структуры. Здесь показана основная форма:

class имя_класса {

закрытые функции и переменные класса

public :

открытые функции и переменные класса

} [ список_объектов;]

В объявлении класса список_объектов не обязателен. Как и в случае со структурой, можно объявлять объекты класса позже, по мере необходимости.

Функции и переменные, объявленные внутри объявления класса, становятся, членами (members) этого класса. По умолчанию все функции и переменные, объявленные в классе, становятся закрытыми для класса. Они доступны только для других членов того же класса. Для объявления открытых членов класса используется ключевое слово public, за которым следует двоеточие. Все функции и переменные, объявленные после слова public, доступны как для других членов класса, так и для любой другой части программы, в которой находится этот класс.

17. Создание конструктора

Для каждого создаваемого объекта требуется инициализация. Для разрешения этой проблемы в Java имеется функция-конструктор (constructor function), включаемая в описание класса. Конструктор класса вызывается всякий раз при создании объекта этого класса. Таким образом, любая необходимая объекту инициализация при наличии конструктора выполняется автоматически.

Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения.

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

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

Пример.

#include <iostream>

using namespace std;

class myclass {

int a;

public:

myclass (int x) ; // конструктор

void show ( ) ;

};

myclass: :myclass (int x)

{

cout << "В конструкторе\n";

a = x;

}

void myclass: :show()

{

cout << a << "\n";

}

int main ( )

{

myclass ob ( 4 ) ; // эквивалент myclass ob = myclass(4);

ob.show ( ) ;

return 0;

}

В отличие от конструктора деструктор не может иметь параметров.

18. Перегрузка конструкторов

В программах на Java перегрузка конструктора класса вполне обычна. (Деструктор перегружать нельзя.)

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

Каждому способу объявления объекта класса должна соответствовать своя версия конструктора класса. Если эта задача не решена, то при компиляции программы обнаружится ошибка. Именно поэтому перегрузка конструктора столь обычна для программ Java. Наиболее частое использование перегрузки конструктора - это обеспечение возможности выбора способа инициализации объекта.

Например, в следующей программе объекту ol дается начальное значение, а объекту о2 - нет. Если вы удалите конструктор с пустым списком аргументов, программа не будет компилироваться, поскольку у неинициализируемого объекта типа samp не будет конструктора. И наоборот, если вы удалите конструктор с параметром, программа не будет компилироваться, поскольку не будет конструктора у инициализируемого объекта типа samp. Для правильной компиляции программы необходимы оба конструктора.

#include <iostream>

using namespace std;

class myclass {

int x ;

public:

// перегрузка конструктора двумя способами

myclass() { x = 0; } // нет инициализации

myclass(int n) { х = n; } // инициализация

int getx() { return x; }

};

int main ( )

{

myclass ol (10) ; // объявление с начальным значением

myclass o2; // объявление без начального значения

cout << "ol: " << ol.getx( ) << '\n';

cout << "o2: " << o2.getx( ) << '\n';

return 0;

}

Другой традиционный довод в пользу перегрузки конструктора состоит в том, что такая перегрузка позволяет сосуществовать в программе как отдельным объектам, так и массивам объектов.

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

Например, для класса myclass из примера 1 оба этих объявления правильны:

myclass ob(10);

myclass ob[5] ;

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

Например, в следующей программе объявляются два массива типа myclass, при этом один из них инициализируется, а другой нет:

#include <iostream>

using namespace std;

class myclass {

int x;

public:

// перегрузка конструктора двумя способами

myclass ( ) { x = 0; } // нет инициализации

myclass (int n) { x = n; } // инициализация

int getx() { return x; }

};

int main( )

{

myclass ol[10]; // объявление массива без инициализации

myclass о2[10] = {1,2,3, 4, 5, 6, 7, 8, 9, 10} ; // объявление с инициализацией

int i ;

for(i=0; i<10; i++) {

cout << "ol[ " << i << "]:" << ol [i] .getx() ;

cout << '\n';

cout << "o2[ " << i << "]:" << o2[i] .getx();

cout << '\n';

return 0;

}

В примере все элементы массива o1 конструктор устанавливает в нуль. Элементы массива о2 инициализируются.

Перегрузка конструкторов позволяет программисту выбрать наиболее подходящий метод инициализации объекта.

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