Материал: Sb97282

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

2. Имя конструктора_ имя объекта (список аргумента): sumz(5,7);

2.1. Перегруженный конструктор

Пример: class data

{

int day, month, year; public:

data (int a, int b, int c); data (void);

data (int);

………..

};

data :: data (int a, int b, int c)

{

day = a; month = b; year = c;

}

data :: data (void)

{day = 1; month = 1; year = 1989; } data :: data (int x)

{day = x; month = 3; year = 2007; } data d1 (2, 8, 2006);

data my_birthday; data today (2);

Компилятор в зависимости от количества и типов параметров сам выбирает нужный конструктор.

2.2. Деструкторы

Деструкторы – это специальные функции-члены, которые уничтожают объекты класса и освобождают занимаемую этими объектами память; также осуществляют восстановление экрана, закрытие файла и т. д.

Деструктор имеет такое же имя, как и класс, но перед ним ставится знак тильда ~.

11

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

data :: ~data() {…}

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

Пример: составить программу, осуществляющую вычисление по форму-

ле: S = a*b + c*k + a*c. #include <iostream.h> class Pro

{

int x, y, z; public:

Pro (int, int);

int put x (); int put y (); int put z (); voidproizv (void);

~Pro ();

};

Pro :: Pro (int x1, int y1) { x = x1; y = y1; }

int Pro :: put x () {return x ;} int Pro :: put y () {return y ;} int Pro :: put z () {return z ;} void Pro :: proizv () {z = x*y ;} Pro :: ~Pro () {}

void main ()

{

int S, a, b, c, k;

cout<< “\n Введите a, b, c и k \n”; cin>> a >> b >> c >> k;

Pro D = Pro (a, b); Pro E (c, k);

Pro F (a, c); D.proizv ();

S = D.put z () + E.put z () +F.put z ();

12

cout<< “сумма = “<<S; F. Pro :: ~ Pro ();

E. Pro :: ~ Pro ();

D. Pro :: ~ Pro ();

}

3.ДРУЖЕСТВЕННЫЕ ФУНКЦИИ

ИДРУЖЕСТВЕННЫЕ КЛАССЫ

Одним из важных принципов С++ является возможность защиты данных от несанкционированного доступа, которая реализуется с помощью ключевого слова private. Возможны ситуации, когда необходимо, чтобы к закрытой части класса имела доступ функция, не являющаяся членом этого класса.

Функция – не член класса, получившая право доступа к закрытой части класса, называется дружественной функцией. Функция становится дружественной после описания при помощи ключевого слова friend.

Фрагмент: class CL {

public:

friend void frd (void);

};

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

Пример: два класса vector и matrix, каждый скрывает свое представление и предоставляет полный набор действий для манипуляций с объектами его типа:

vector – целочисленный массив из 4 элементов; индексы изменяются

0–3;

matrix – массив из 4 векторов; индексы изменяются 0–3.

Доступ к элементам матрицы и вектора осуществляется через похожие функции elem:

int elem (int i);

int elem (int i, int y).

Задача: определить функцию, обеспечивающую умножение матрицы на вектор.

13

Способ 1. При помощи глобальной функции multiply(): vector multiply(matrix &m, vector &v)

{

vector r;

for (int i=0; i<3; i++){ r.elem (i) = 0;

for (int j = 0; j<3; j++)

r.elem (i)+ = m.elem (i,j)* v.elem (j);

}

return r;

}

Способ неэффективен, так как приходится многократно вызывать функ-

цию elem.

Если бы функция multiply была функцией-членом класса vector, то можно было бы без функции elem обращаться к элементам класса vector. Аналогично, если бы функция multiply была функцией-членом класса matrix. Обратиться одновременно к закрытым элементам нескольких классов может только дружественная функция.

Способ 2. При помощи дружественной функции: class vector {

int v[4]; ….. public:

friend vector multiply (matrix&, vectot&);

}

class matrix { int v[4][4];

…..

public:

friend vector multiply (matrix&, vector&);

}

vector multiply (matrix &m, vector &v){ vector r:

for (inti=0; i<=3; i++)

14

{ r.v [i] = 0;

for (int j=0; j<=3; j++) r.v[i]+= m.v[i][j]*v.v[j];

}

return r;}

Дружественная функция не имеет никаких других особенностей, кроме права доступа к закрытой части класса. В данном примере обращение к элементам matrix и vector осуществляется непосредственно.

Функция-член одного класса может быть другом другого класса. Пример:

class x // дружественная для класса y.

{

void f ();

}; class y{

….

friend void x :: f ();

};

Рассмотрим подробнее функции дружественных классов. При таком задании все функции-члены одного класса могут являться друзьями другого класса.

class x {…}; class y { ….

friend class x;

….

};

Есть класс x и класс y, причем класс x является дружественным для класса y. Объявление класса дружественным предполагает, что закрытые и защищенные члены класса y могут использоваться в классе x.

4. УТОЧНЕНИЕ ИМЕНИ ЭЛЕМЕНТА

Иногда полезно различать имена элементов класса и просто имена. Для этого используется операция двойное двоеточие (::) – разрешение области видимости.

15