Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документ Microsoft Office Word (2).docx
Скачиваний:
44
Добавлен:
09.02.2015
Размер:
842.69 Кб
Скачать

Описание функций в теле класса

В теле класса можно указать только заголовок функции, а можно описать всю функцию. Во втором случае она считается встроенной (inline), например:

class Array {

public:

void Alloc(int _len)

{if (len==0) Free(); len=_len; val=new double[len];}

и так далее.

Конструкторы и деструкторы

Однако в приведённом примере не решена важная проблема: функции Alloc и Free по-прежнему надо вызывать вручную. Другая проблема данного примера — опасность оператора присваивания.  Для решения этих проблем в язык были введены конструкторы и деструкторы. Конструктор вызывается каждый раз, когда создаётся объект данного типа; деструктор - при уничтожении. При преобразованиях типов, присваивании, передаче параметра тоже вызываются конструкторы и при необходимости деструкторы.  С конструкторами и деструктором класс выглядит так:

class Array {

public:

Array() : len(0), val(NULL) {}

Array(int _len) : len(_len) {val = new double[_len];}

Array(const Array& a);

~Array() { Free(); }

inline double Elem(int i);

inline void ChangeElem(int i, double x);

protected:

void Alloc(int _len);

void Free();

int len;

double* val;

};

Array::Array(const Array& a) : len(a.len)

{

val = new double[len];

for (int i=0; i<len; i++)

val[i] = a.val[i];

}

Здесь Array::Array - конструктор, а Array::~Array - деструктор. Конструктор копирования (copy constructor) Array::Array(const Array&) вызывается при присваивании. Теперь объект класса Array нельзя испортить: как бы мы его ни создавали, что бы мы ни делали, его значение будет хорошим, потому что конструктор вызывается автоматически. Все опасные операции с указателями спрятаны в защищённые функции.

Array a(5); // вызывается Array::Array(int)

Array b; // вызывается Array::Array()

Array c(a); // вызывается Array::Array(const Array&)

Array d=a; // то же самое происходит вызов оператора =

b=c; // если он не определен (как в данном случае),

// то вызывается оператор присваивания по-умолчанию,

// который осуществляет побитовое копирование для базовых

// типов и вызов оператора присваивания для

// пользовательских как правило конструктор копий и

// оператор присваивания переопределяются попарно

Оператор new тоже вызывает конструкторы, а delete - деструкторы.  По умолчанию, каждый класс имеет конструктор без параметров и деструктор. Конструктор без параметров по умолчанию вызывает конструкторы всех элементов, а деструктор - их деструкторы. Другие конструкторы по умолчанию не определены.  Класс может иметь сколько угодно конструкторов (с разными наборами параметров), но только один деструктор (без параметров).

Другие возможности функций-членов

Функции-члены могут быть и операциями:

class Array {

...

inline double &operator[] (int n);

И далее

Array a(10);

...

double b = a[5];

Функции-члены (и только они) могут иметь описатель const

class Array {

...

inline double operator[] (int n) const;

Такие функции не имеют права изменять поля класса (кроме полей, определённых как mutable). Если они пытаются это сделать, компилятор должен выдать сообщение об ошибке.