
- •Лабораторная работа.4. Знакомство со средой разработки. Основы создания классов
- •Среда разработки Visual Studio 2005. Hello new word!
- •Вывод результатов компиляции и диагностики приложения
- •Инструментарий отладки Visual Studio
- •Использование точек останова
- •Контроль значений переменных при пошаговом выполнении
- •Классы и объекты
- •Краткие сведения по теме
- •Использование класса
- •Определение методов класса
- •Общее задание 1. Пример программы
- •Вложенные классы
- •Задания
- •Индивидуально задание 1: Структура-пара
- •Индивидуально задание 2: Структуры и классы
- •Требования к отчетам по лабораторной работе №4
- •Общее задание для проведения лабораторной работы:
- •Сведения по теме
- •Перегрузка операций
- •Перегрузка операций внешними функциями
- •Перегрузка операций методами класса
- •Функции-друзья класса
- •Конструкторы и деструктор
- •Конструкторы и параметры
- •Константы в классе
- •Поля-массивы в классе
- •Операция индексирования
- •Статические элементы класса
- •Подсчет объектов класса
- •Индивидуальные задания
- •Задание по теме: Конструкторы и перегрузка операций
- •Задание по теме: Массивы и константы в классе

Основы создания программ в Си |
Page 25 of 58 |
|
|
|
|
t2.Read(); // запрашиваем ввод времени t2
t2.Display(); NEW_LINE;
cout << "Summ of hours: t2 + t = ";
time summ = t.addhours(t2); // получаем сумму часов summ.Display();
NEW_LINE;
cout << "Next hour fot t2 is: \n";
time t3 = t2.nexthour(); // получаем следующий час
std::string str = t3.toString();
cout << str; // выводим форматированную строку времени getch();
return 0;
}
Вложенные классы
Класс, объявленный внутри другого класса, называется вложенным. Он является членом объемлющего класса, и его определение может быть открыто (public) или закрыто (private). Уровень вложенности стандартом не ограничивается.
Имя вложенного класса должно быть уникально в объемлющем классе, но может совпадать с другими именами вне класса.
Доступа по умолчанию к приватным компонентам объемлющего класса вложенный класс не имеет, как и объемлющий класс — к приватным компонентам вложенного. Обойти запрет помогает механизм дружественных отношений, например
class External |
|
|
{ //... |
|
|
friend class Inner; |
//Inner доступна приватная |
|
|
// |
часть External |
class Inner |
// |
вложенный класс |
{ |
|
|
friend class External; |
// |
External доступна приватная |
|
// |
часть Inner |
}; |
|
|
}; |
|
|
|
|
|
Ни вложенный класс, ни объемлющий |
не |
могут обращаться к методам друг друга |
непосредственно; как и в случае обычных невложенных классов, необходимо объявить объект

Основы создания программ в Си |
Page 26 of 58 |
(или указатель), для которого уже вызвать нужный метод. Объект объемлющего класса может передаваться методу вложенного класса как аргумент.
void External::Inner::MethodInner(const External &t)
{
//...
memlnner = t.MethodExternaK); // вызов метода объемлющего класса
}
Метод вложенного класса Methodlnner() получает ссылку на объект внешнего класса и обычным способом вызывает метод MethodExternal().
Если вложенный класс объявлен как public, то его можно использовать в качестве типа по всей программе. Его имя следует писать с префиксом — именем объемлющего класса:
External::Inner *pointer;
Если вложенный класс объявлен в закрытой части объемлющего класса, то он доступен только членам объемлющего класса и его друзьям. В этом случае компоненты вложенного класса обычно делают открытыми — тогда нет нужды и объявлять другом объемлющий класс, например
class External
{
//... |
|
|
friend class Inner; |
// Inner |
доступна приватная |
|
// часть |
External |
struct Inner { /* все элементы доступны в External */ }:
};
Внутри методов вложенного класса ключевое слово this является указателем на текущий объект вложенного класса.
Методы вложенного класса можно реализовать непосредственно внутри класса. Если же методы вложенного класса определяются вне класса, определение необходимо ставить вне самого внешнего из объемлющих классов — в области глобальной видимости. Имя метода в таком случае должно иметь префиксы; количество префиксов равно уровню вложенности классов.
В области глобальной видимости вне объемлющего класса можно определить и сам вложенный класс. C++ разрешает это делать, если в объемлющем классе задать объявление класса, например
class A { |
|
//... |
|
class В; |
// объявление вложенного класса |
}; |
|
class A::B |
// внешнее определение вложенного класса |
|
|