
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
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 символ не найден";
}