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

23.Вложенные классы

Один класс может быть объявлен в другом классе, в этом случае внутрен-

ний класс называется вложенным:

class ext_class

{ class int_cls

{ · · ·

};

public:

· · ·

};

Класс int_cls является вложенным по отношению к классу ext_class

(внешний).

Доступ к компонентам вложенного класса, имеющим атрибут private,

возможен только из функций вложенного класса и из функций внешнего клас-

са, объявленных со спецификатором friend во вложенном классе.

#include <iostream>

using namespace std;

class cls1 // внешний класс

{ class cls2 // вложенный класс

{ int b; // все компоненты private для cls1 и cls2

cls2(int bb) : b(bb){} // конструктор класса cls2

};

public: // public секция для cls1

int a;

class cls3 // вложенный класс

{ int c; // private для cls1 и cls3

public: // public-секция для класса cls3

cls3(int cc): c(cc) {} // конструктор класса cls3

};

cls1(int aa): a(aa) {} // конструктор класса cls

};

void main()

{ cls1 aa(1980); // верно

//cls1::cls2 bb(456); // ошибка cls2 cannot access private

cls1::cls3 cc(789); // верно

cout << aa.a << endl; // верно

//cout << cc.c << endl; // ошибка 'c' : cannot access private member

// declared in class 'cls1::cls3'

}

24.Static-компоненты данные класса

Компоненты-данные могут быть объявлены с модификатором класса па-

мяти static. Класс, содержащий static компоненты-данные, объявляется как гло-

бальный (локальные классы не могут иметь статических членов). Static-

компонента совместно используется всеми объектами этого класса и хранится в

одном месте. Статическая компонента глобального класса должна быть явно

определена в контексте файла. Использование статических компонент-данных

класса продемонстрируем на примере программы, выполняющей поиск введен-

ного символа в строке

enum boolean {fls,tru};

class cls

{ char *s;

public:

static int k; // объявление static-члена в объявлении класса

static boolean ind;

void inpt(char *,char);

void print(char);

};

int cls::k=0; // явное определение static-члена в контексте файла

boolean cls::ind;

void cls::inpt(char *ss,char c)

{ int kl; // длина строки

cin >> kl;

ss=new char[kl]; // выделение блока памяти под строку

cout << "введите строку\n";

cin >> ss;

for (int i=0; *(ss+i);i++)

if(*(ss+i)==c) k++; // подсчет числа встреч буквы в строке

if (k) ind=tru; // ind==tru − признак того, что буква есть в строке

delete [] ss; // освобождение указателя на строку

}

void cls::print(char c)

{ cout << "\n число встреч символа "<< c <<"в строках = " << k;

}

void main()

{ cls c1,c2;

char c, *s;

cls::ind=fls;

cout << "введите символ для поиска в строках";

cin >> c;

c1.inpt(s,c);

c2.inpt(s,c);

if(cls::ind) c1.print(c);

else cout << "\n символ не найден";

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]