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

Дружественные функции.

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

void ff ( int a, int b)

{ … } ;

class cmatr {

float **m ; // объекты класса

int n, k ;

friend void ff ( int, int) ; // декларация дружественной функции.

public : … // методы класса

}

Можно объявить дружественной функцией, как обычную функцию, так и метод другого класса.

Мы подобрались к очень важной и серьезной теме – взаимодействие классов, построение одного класса из другого. Это будет рассмотрено в теме – Наследование, а перед ней еще один пример класса.

Класс множество.

В языке С нет перечислимых типов, поэтому задачи принадлежности месяцу, цвету и т. п. решаются через оператор case. Для более интересного решения таких задач можно разработать класс множество, с использованием такого класса очень элегантно решаются задачи на пересечение, объединение множеств.

include<conio.h>

include<stdio.h>

include<stdlib.h>

// класс целочисленное множество х из len элементов

class cset {

int *x ; // объекты

int len ;

public: cset () ; // методы

cset (int *, int ) ;

int In ( int ) ;

int Get (int num) { return x[num] ; } // выдача элемента

int Getslen () { return len ; } // количество элементов во множестве

void Put ( int n, int i) { *(x+i) = n ; } // положить элемент во множество

cset operator = ( cset &) ;

cset operator ^ ( cset &) ;

}

cset::cset () // конструктор пустого множества

{ len =10 ;

x = (int*) malloc ( len*sizeof( int)) ;

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

*(x+i) = ‘\0’ ;

}

cset::cset ( int *y, int d ) // конструктор произвольного множества из d элементов

{ len =d ;

x = (int*) malloc ( len*sizeof( int)) ;

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

*(x+i) = *(y+i) ;

}

int cset::In( int a ) // проверка принадлежности элемента а множеству

{ int i, p = 0 ;

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

if ( *(x+i) == a ) p = 1 ;

return p ;

}

cset cset::operator = ( cset &s) // перегрузка оператора присваивания

{ for ( int i=0 ; i<s.len ; i++)

(*this).x.[i] = s.x[i] ;

(*this).len = s.len ;

return (*this) ;

}

cset cset::operator ^ ( cset &s) // создание оператора пересечения множеств

{ int *sa = (int *) malloc ((*this).Getslen()*sizeof(int)) ;

int d = 0, n ;

for ( int i = 0 ; i<(*this).Getslen() ; i++)

{ n = (*this).Get(i) ;

if ( s.In (n) )

{ *(sa+d) = n ;

d++ ;

}

}

cset st ( sa, d ) ;

return st ;

}

main() // создание двух множеств s1 и s2 и нахождение их пересечения множества r

{ int sx1[] ={1, 2, 3, 4, 5} ;

int sx2[] ={2, 3, 4, 5, 6} ;

cset s1(sx1, 5) ;

cset s2(sx2, 5) ;

cset r = s1^s2 ;

for ( int i=0 ; i<r.Getsln() ;i++) // поэлементное распечатывание r

printf ( “\n%d “< r.Get( i) ) ;

getch() ;

}