
- •Омск 2007
- •Введение
- •1. Этапы разработки программного обеспечения
- •2.1 Операции
- •Приоритеты операций
- •2.2 Операторы языка Си
- •9. Оператор break;
- •10. Оператор continue;
- •2.3 Перегрузка функций
- •2.4 Перегрузка операций
- •2.5 Шаблоны функций
- •2.6 Возврат из функции нескольких значений
- •2.7 Стандартные типы данных
- •Типы данных
- •2.8 Типы, определяемые пользователем
- •2.8.1 Структуры
- •2.8.2 Поля битов
- •2.8.3 Объединения Используются для хранения значений различных типов в одной и той же области памяти, но не одновременно.
- •Пример: а) union u int I; б) struct s int I;
- •2.8.4 Перечисления
- •2.8.5 Переименование типов typedef
- •Объявление typedef применяется:
- •2.9 Файлы
- •2.11 Директивы препроцессора Условная компиляция
- •Оператор defined или знак операции препроцессора
- •Директивы #ifdef и #ifndef
- •Директива #error
- •Директива #line
- •Предопределенные макросы
- •Директива #pragma
- •3. Объектно-ориентированное программирование
- •3.1 Объект
- •3.2 Управление доступом к элементам и функциям класса
- •3.3 Конструкторы и деструкторы
- •Деструктор
- •Конструктор с параметрами
- •3.4 Аргументы функций, задаваемые по умолчанию
- •3.5 Дружественные функции и классы
- •Дружественные классы
- •3.6 Наследование классов
- •3.7 Конструкторы с параметрами при наследовании
- •3.8 Множественное наследование
- •3.10 Полиморфизм
- •Ключевое слово this
- •3.11 Использование виртуальных функций
- •3.12 Виртуальные базовые классы
- •4. Организация выполнения курсовой работы
- •4.1 Этапы выполнения курсовой работы
- •4.2 Требования к пояснительной записке
- •4.3 Задания на курсовое проектирование
- •4.3.1 Проектирование пакетов прикладных программ для предприятий
- •4.3.2 Разработки для учебного процесса
- •4.3.3 Задание на разработку типового проекта - компилятора языка и стекового калькулятора
- •Индивидуальное задание
- •Состав пакета
- •Варианты заданий
- •Библиографический список
- •Курсовой проект (работа)
- •Пример оформления листа задания к курсовому проектированию
- •Задание
- •Студент Азанова Александра Александровна группа в-515
- •Аннотация
- •Оглавление
- •Структура слайд-доклада
- •Структура-компонент проекта
Дружественные классы
При объявлении класса можно объявить сразу все функции – члены другого класса дружественными одним объявлением.
class X {…..};
class Y
{…..
friend class X;
…
};
Объявление класса дружественным предполагает, что приватные, защищенные члены класса X могут использоваться в классе Y.
3.6 Наследование классов
Наследованием реализуется возможность разрабытывать сложные классы, продвигаясь от общего к частному.
Основная форма наследования:
class <имя наследующего класса>: режим доступа < наследуемый класс> ;
или
class <производный> <базовый>;
Класс, который наследуется называется базовым классом, наследующий – производным (или потомком).
Режим доступа – это одно из ключевых слов private, protected, public.
Опция public означает, что все элементы типа public предка будут типа public и для класса, который наследует его, т.е. общие элементы могут быть доступны другим функциям программы.
Когда один класс наследует другой класс, все приватные элементы базового класса недоступны для производного.
class X // Базовый класс
{ // Приватные элементы:
int i;
int j;
public:
void get_ij(void);
void put_ij(void);
};
class Y: public X // Производный класс Y
{
int k;
public:
int get_k(void);
void make_k(void);
};
В этом примере Х – базовый класс, Y – производный класс. Члены класса Y могут использовать общие функции get_ij( ) и put_ij ( ), но они не могут использовать i и j, т. к. они приватные для Х (частный) и соответственно, недоступны для функций get_k ( ), make_k ( ) класса Y.
Чтобы обеспечить доступ членов функций класса Y к элементам i j класса Х, надо их в классе Х объявить защищенными (protected:). Теперь члены класса Y имеют доступ к членам i и j класса Х. В то же время i и j остаются недоступными для остальной части программы. Доступ наследуется к элементам, объявленным защищенными или общими, но не наследуется для приватных элементов.
Наследование – один из главных механизмов объектно-ориентированного программирования. С его помощью можно разрабатывать очень сложные классы, продвигаясь от общего к частному, а также «наращивать» уже созданные, получая из них новые классы, немного отличающиеся от исходных.
При проектировании сложного класса необходимо определить общие свойства для его объектов, установить, нет ли похожего готового класса. Надо вначале набросать план разрабатываемого класса, а затем переходить к постепенной детализации, создавая на основе уже построенных классов новые, которые наследуют от них свойства и поведение, приобретая в то же время новые качества.
Если режим доступа отсутствует, то предполагается по умолчанию режим доступа public при производном классе структура, и private, если производный класс – класс.
При режиме доступа public общие и защищенные члены базового класса остаются общими и защищенными членами производного класса. Если режим доступа private, то все общие и защищенные члены базового класса остаются приватными элементами производного класса. Если режим доступа protected, то все общие и защищенные члены базового класса становятся защищенными членами производного класса.
Доступ наследуется к элементам, объявленным защищенными или общими, но не наследуется для приватных элементов. Сказанное выше иллюстрируется таблицей 5.
Таблица 5
Режимы доступа
Режим доступа к элементу в базовом классе |
Режим доступа при наследовании класса |
Режим доступа к элементу в производном классе |
Private |
publuc |
Не доступен |
Protected |
Protected |
|
public |
Public |
|
Private |
protected |
Не доступен |
Protected |
Protected |
|
public |
Protected |
|
Private |
private |
Не доступен |
Protected |
Private |
|
public |
Private |
Пример передачи режима доступа к переменным при наследовании [7]
#include <iostream.h> nasled.cpp
class X
{ protected:
int i; // i, j класса X protected в классе Y
int j;
public:
void get_ij(void);
void put_ij(void);
};
class Y: public X
{ int k; // private
public:
int get_k(void);
void make_k(void);
};
class Z: public Y // Z имеет доступ к переменным i, j класса X
{ public: // Z не имеет доступа к переменной k класса Y
void f(void);
};
void X:: get_ij(void)
{ cout<< "Введите два числа";
cin>> i >> j;
}
void X:: put_ij(void)
{ cout<< "i=" << i << "j="<< j << "\n"; }
int Y:: get_k(void)
{ return k; }
void Y:: make_k(void)
{ k = i*j; }
void Z:: f(void)
{ i=2; j=3; }
void main(void)
{
Y var;
Z var2;
var.get_ij();
var.put_ij();
var.make_k();
cout<< var.get_k();
cout<< "\n";
var2.f();
var2.put_ij();
var2.make_k();
cout<< var2.get_k();
cout<< "\n";
}
Если заменить режим доступа при наследовании класса Х на private, то функция void Z:: d(void) не будет иметь право доступа к переменным i, j.
Замена режима доступа при наследовании класса Z на private, не изменяя режим доступа при наследовании класса Х, действие примера по сравнению с начальным не изменит.